- 题目描述
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
- 题解
回溯法
- 代码
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
if (n==0) return vector<vector<string>>(0);
vector<bool> colum(n,false);
vector<bool> f1(2*n,false);
vector<bool> f2(2*n,false);
string s(n,'.');
vector<string> vec(n,s);
dfs(0,n,vec,colum,f1,f2);
return res;
}
bool isvalid(int x,int y,int n,vector<bool> colum,vector<bool> f1,vector<bool> f2){
if (colum[y]||f1[x-y+n-1]||f2[x+y]) return false;
return true;
}
void dfs(int x,int n,vector<string> vec,vector<bool> colum,vector<bool> f1,vector<bool> f2){
if (x==n){
res.push_back(vec);
return ;
}
for (int y=0;y<n;y++){
if (colum[y]||f1[x-y+n-1]||f2[x+y]) continue;
colum[y]=true;
f1[x-y+n-1]=true;
f2[x+y]=true;
vec[x][y]='Q';
dfs(x+1,n,vec,colum,f1,f2);
colum[y]=false;
f1[x-y+n-1]=false;
f2[x+y]=false;
vec[x][y]='.';
}
}
vector<vector<string>> res;
};