重构:
class Solution {
public:
bool _is_valid(vector<int> &place, int cur){
for(int i=0;i<cur;++i){
int dif = abs(place[i]-place[cur]);
if(dif==0 || dif == cur-i)
return false;
}
return true;
}
void _solveNQueens_helper(vector<vector<string> > &res,vector<int> &place,int cur, int n){
if(cur==n){
vector<string> tmp;
for(int i=0;i<n;++i){
string s(n,'.');
s[place[i]]='Q';
tmp.push_back(s);
}
res.push_back(tmp);
return;
}
for(int i=0;i<n;++i){
place[cur] = i;
if(_is_valid(place,cur))
_solveNQueens_helper(res,place,cur+1,n);
}
}
vector<vector<string> > solveNQueens(int n) {
vector<vector<string> >res;
vector<int> place(n);
_solveNQueens_helper(res,place,0,n);
return res;
}
};
经典八皇后问题。
class Solution {
public:
bool _is_valid(vector<string> &tmp, int i, int j){
for(int p=0;p<i;++p)
if(tmp[p][j]=='Q')
return false;
int p=i-1, q=j-1;
while(p>=0 && q>=0){
if(tmp[p][q]=='Q')
return false;
--p;
--q;
}
p=i-1; q=j+1;
while(p>=0 && q<tmp.size()){
if(tmp[p][q]=='Q')
return false;
--p;
++q;
}
return true;
}
void _solveNQueens_helper(vector<vector<string> > &res,vector<string> &tmp,int cur, int n){
if(cur==n){
res.push_back(tmp);
return;
}
for(int j=0;j<n;++j){
if(_is_valid(tmp,cur,j)){
tmp[cur][j]='Q';
_solveNQueens_helper(res,tmp,cur+1,n);
}
tmp[cur][j]='.';
}
}
vector<vector<string> > solveNQueens(int n) {
vector<vector<string> >res;
vector<string> tmp(n,string(n,'.'));
_solveNQueens_helper(res,tmp,0,n);
return res;
}
};