n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。
给定一个整数n,返回所有不同的n皇后问题的解决方案。
每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。
样例
对于4皇后问题存在两种解决的方案:
[
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."],
["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]
class Solution {
vector<string> base;
vector<vector<string> > ret;
void search(vector<int> &c,int n,int cur){
if(n==cur){
ret.push_back(base);
return;
}
for(int i=0;i<n;++i){ //cur表示当前行,i表示要选择的列
if(isValid(c,cur,i)){ //检验当前列是否合法
c[cur]=i;
string s(n,'.');
s[i]='Q'; //当前位置摆放皇后,那么同一行其他位置全部是'.'
base.push_back(s);
search(c,n,cur+1); //搜寻下一行
base.pop_back(); //别忘了弹出,base用于存放下一组可能位置
}
}
}
bool isValid(vector<int> &c,int row,int col){
for(int i=0;i<row;++i)
if(c[i]==col||row-col==i-c[i]||row+col==i+c[i]) //分别检查纵向,主对角线,副对角线上是否有其他皇后
return false; //因为是一行一行摆放,所以不用检查同一行
return true;
}
public:
vector<vector<string> > solveNQueens(int n) {
if(n<=0)
return ret;
vector<int> c(n);
search(c,n,0);
return ret;
}
};