N皇后問題II
阿新 • • 發佈:2019-01-07
n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。
求解:給定一個整數 n,返回 n 皇后不同的解決方案的數量。
前面我寫過 n皇后問題演算法,連結如下:
n皇后問題II 的演算法思想和n皇后問題是類似的,但是相對更加簡單,不需要使用複雜的資料結構。可以先閱讀我的其中一篇文章,然後去獨立做另一個,不會做的話在看另一篇找思路,鞏固演算法思想。
示例如下:
輸入: 4
輸出: 2
解釋: 4 皇后問題存在如下兩個不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q." , // 解法 2
"Q...",
"...Q",
".Q.."]
]
具體演算法如下:
class Solution {
private int res;
private boolean[] col;
private boolean[] dia1;
private boolean[] dia2;
public int totalNQueens(int n) {
if(n < 1)
return 1;
col = new boolean[n];
dia1 = new boolean[2*n-1];
dia2 = new boolean[2*n-1];
putQueue(n, 0);
return res;
}
// n 皇后問題中,尋找第index行皇后所在位置
private void putQueue(int n, int index){
if(index == n){
res ++;
return ;
}
for(int i=0; i<n; i++)
if ( !col[i] && !dia1[i+index] && !dia2[i-index+n-1]){
col[i] = true;
dia1[i+index] = true;
dia2[i-index+n-1] = true;
putQueue(n, index+1);
col[i] = false;
dia1[i+index] = false;
dia2[i-index+n-1] = false;
}
return ;
}
}