n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解题思路:本题与上一题(51.N皇后问题)思路相同,不同点在于上一题是保存每种具体解法,本次是记录多少种解决方案。
java代码:
class Solution {
int cnt = 0;
public int totalNQueens(int n) {
boolean[] line = new boolean[n];//line[i]记录第i行是否有皇后
boolean[] col = new boolean[n];//col[i]记录第i列是否有皇后
boolean[] leftDiagonal = new boolean[2*n-1];//leftDiagonal[i]记录从上往下数第i条左斜对角线是否有皇后
boolean[] rightDiagonal = new boolean[2*n-1];//rightDiagonal[i]记录从上往下数第i条右斜对角线是否有皇后
dfs(0, 0, line, col, leftDiagonal, rightDiagonal);
return cnt;
}
private void dfs(int s, int queen, boolean[] line, boolean[] col, boolean[] left, boolean[] right){
int n = line.length;
for(; s < n*n; s++){
int h = s/n, l = s%n;
if(line[h] || col[l] || left[h+l] || right[Math.abs(l-h-(n-1))]){
continue;
}
queen++;
line[h] = true;
col[l] = true;
left[h+l] = true;
right[Math.abs(l-h-(n-1))] = true;
dfs(s+1, queen, line, col, left, right);
queen--;
line[h] = false;
col[l] = false;
left[h+l] = false;
right[Math.abs(l-h-(n-1))] = false;
}
if(n == queen){
cnt++;
}
}
}