python 八皇后问题

def conflict(state, nextx):
    nexty = len(state)
    for i in range(nexty):
        if abs(state[i] - nextx) in (0, nexty - i):
            return True
    return False

def queen(num=8, state=()):
    for pos in range(num):
        if not conflict(state, pos):
            if len(state) == num-1:
                yield (pos,)
            else:
                for result in queen(num, state + (pos,)):
                    yield result + (pos,)

for solution in queen(4):
    print(solution)

相关代码已经看得差不多了,但是任然有一个问题未能解决:

在程序第一次进入代码循环至 conflict 时,state 元组是空的什么都还没有,但是:

if abs(state[i] - nextx) in (0, nexty - i):

这句中却将 state[0] 列了出来,这样明明是不能通过的但是却正常运行了!

我知道一定是我哪里理解有问题了,请各位帮我解答当第一次循环时 state 是这样解决的?

阅读 3.1k
2 个回答

state为空时,range(nexty)为空, for循环是不执行的, 直接return False了。

八皇后问题
给你个参考,js的实现

const NUM_QUEENS = 8;
let solutionNum = 0;

let queens = (new Array(NUM_QUEENS)).fill(-1);
function eightQueensPuzzle(queens) {
    placeQueen(queens, 0);
    console.log(`解个数为${solutionNum}`);
}

function placeQueen(queens, row) {
    for(let i = 0; i < NUM_QUEENS; i++) {
        queens[row] = i;
        if(row == 0) {
            placeQueen(queens, row + 1);
        } else {
            if(isLegal(queens, row)) {
                if(row == NUM_QUEENS - 1) {
                    solutionNum++;
                    console.log(queens);
                } else {
                    placeQueen(queens, row + 1);
                }
            }
        }
    }
}

function isLegal(queens, row) {
    for(let i = 0; i < row; i++) {
        if(queens[row] == queens[i] || ( Math.abs(queens[row] - queens[i]) == Math.abs(row - i) )) {
            return false;
        }
    }
    return true;
}

eightQueensPuzzle(queens);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题