問題描述:
在一個8*8的棋盤上,有8個皇后放置在棋盤上,兩兩不能對衝,即行 ,列,斜 只能放置一個皇后。
比如下圖,第一行的皇后行 ,列,斜 只能放置一個皇后。
解答這種題,首先分析算法流程
這裏有一個點特別注意,就是佔位標誌的判斷,首先是列佔位,這個直接標誌就行了
但是斜線角怎麼判斷?
通常上對角,行號減去列號都是相等的,比如拿f[0][0] 來說,它的上對角是哪些呢?
行號0 -列號0 =0 ,它的對角行號減去列號都是0,我們可以用一個數組存儲d1[0] = 0 ,表示佔用,數組的下標是行號減去列號相減的結果。
注意:爲了避免數組下標出現負號,所以相減結果統一加7(爲什麼是7,因爲棋盤上,最小的負數是-7)
接下來下對角,行號加列號都是相等的,其他跟上面同理。但用另外的一個數組d2存儲,方便判斷
接下來要分析程序思想
代碼:
//八皇后問題
var place = [] //存儲皇后放置的列
var flag = [1,1,1,1,1,1,1,1] //標誌數組,表示第col列的皇后是否被佔位。0表示佔位,1表示沒有
var d1 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] //表示第col列的皇后的上對角線的標誌位是否被佔用
var d2 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] //表示第col列的皇后的下對角線的標誌位是否被佔用
function queen(n){
for(var col =0 ;col <8;col++){
if(flag[col] && d1[n-col+7] &&d2[n+col]){
place[n] = col
flag[col] = 0
d1[n-col+7] = 0
d2[n+col] = 0
if(n<7){
queen(n+1) //小於7,進行下一行
}
else{
console.log("八皇后結果",place)
}
//找到一個解後,回溯上一個,看有沒有其他解,所以上一個的佔位標誌要清除
flag[col] = 1
d1[n-col+7] = 1
d2[n+col] = 1
}
}
}
queen(0)