在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  HTML/ python 八皇后問題

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)

相關(guān)代碼已經(jīng)看得差不多了,但是任然有一個(gè)問題未能解決:

在程序第一次進(jìn)入代碼循環(huán)至 conflict 時(shí),state 元組是空的什么都還沒有,但是:

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

這句中卻將 state[0] 列了出來,這樣明明是不能通過的但是卻正常運(yùn)行了!

我知道一定是我哪里理解有問題了,請(qǐng)各位幫我解答當(dāng)?shù)谝淮窝h(huán)時(shí) state 是這樣解決的?

回答
編輯回答
網(wǎng)妓

八皇后問題
給你個(gè)參考,js的實(shí)現(xiàn)

const NUM_QUEENS = 8;
let solutionNum = 0;

let queens = (new Array(NUM_QUEENS)).fill(-1);
function eightQueensPuzzle(queens) {
    placeQueen(queens, 0);
    console.log(`解個(gè)數(shù)為${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);
2018年7月16日 20:04
編輯回答
笨尐豬

state為空時(shí),range(nexty)為空, for循環(huán)是不執(zhí)行的, 直接return False了。

2018年2月16日 08:25