n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
思路: 和51. N皇后思路一样吧。
class Solution {
public:
bool isvalid(vector<string> temp, int i, int j){
// 无需判断行了,每行放一个'Q'之后就会递归到新的一行,所以这个'Q'一定是本行中唯一的'Q',不会有重复的。
for(int q=0; q<i; ++q){//判断列
if(temp[q][j]=='Q') return false;
}
for(int p=i-1,q=j-1; p>=0 && q>=0; --p,--q){//判断左上对角线
if(temp[p][q]=='Q') return false;
}
for(int p=i-1,q=j+1; p>=0 && q<temp[0].size(); --p,++q){//判断右上对角线
if(temp[p][q]=='Q') return false;
}
return true;
}
void dfs(int &re, int n, int i, vector<string> &temp){
if(i==n){
re++;
return;
}
for(int j=0; j<n; ++j){
if(isvalid(temp, i, j)){
temp[i][j]='Q';
dfs(re, n, i+1, temp);
temp[i][j]='.';
}
}
return;
}
int totalNQueens(int n) {
string s;
for(int i=0; i<n; ++i){
s+='.';
}
vector<string>temp(n, s);
int re=0;
dfs(re, n, 0, temp);
return re;
}
};