描述
N皇后问题是把N个皇后放在一个N×N棋盘上,使皇后之间不会互相攻击。
给出一个整数n,返回n皇后问题的所有摆放方案
例如:
4皇后问题有两种摆放方案
[".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ]
class Solution {
public:
//tmp[i]表示第i行的Q在哪一列
void findSolution(int n,vector<vector<int> >&pos,
vector<int>&tmp){
if(tmp.size()==n)
{
pos.push_back(tmp);
return;
}
int i,j,k;
for( i=0;i<n;i++){
k=tmp.size();
for( j=0;j<k;j++){
if(i==tmp[j]||
abs(k-j)==abs(i-tmp[j]))
break;
}
if(j<k)
continue;
tmp.push_back(i);
findSolution(n,pos,tmp);
int end=tmp.size()-1;
if(k!=end)
tmp.erase(tmp.begin()+k,
tmp.begin()+end);
else
tmp.erase(tmp.begin()+k);
}
}
void drawSolution(int n,vector<vector<string> >&solve,
vector<vector<int> >&pos){
for(int i=0;i<pos.size();i++){
string s(n,'.');
vector<string>row(n,s);
for(int j=0;j<n;j++){
row[j][pos[i][j]]='Q';
}
solve.push_back(row);
}
}
vector<vector<string> > solveNQueens(int n) {
vector<vector<string> >solve;
if(n<1)
return solve;
vector<vector<int> >pos;
vector<int>tmp;
findSolution(n,pos,tmp);
if(pos.empty())
return solve;
drawSolution(n,solve,pos);
return solve;
}
};