n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解法:
原始方法直接遍历棋盘,把每个棋盘的每种情况都尝试一遍,不推荐使用
const int N = 1010;
class Solution {
public:
char grid[N][N];
bool row[N],col[N],dg[N],udg[N];
int un,res = 0;
void qdfs(int x,int y,int s){ //s表示要不要摆
if(y == un){ //横着走到边界
y = 0,x++;
}
if(x == un){ //走到棋盘中的最后一格
if(s == un){
res++;
}
return;
}
qdfs(x,y+1,s); //决策1不摆
//决策2 摆
if(!row[x] && !col[y] && !dg[x+y] && !udg[un-y+x]){
row[x] = col[y] = dg[x+y] = udg[un-y+x] = true;
grid[x][y] = 'Q';
qdfs(x,y+1,s+1);
row[x] = col[y] = dg[x+y] = udg[un-y+x] = false;
grid[x][y] = '.';
}
}
int totalNQueens(int n) {
un = n;
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
grid[i][j] = '.';
}
}
qdfs(0,0,0);
int sres = res;
return sres;
}
};