问题
思路
dfs搜索即可,注意剪枝的条件。
注意,此时的搜索要恢复状态。
代码
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> ret;
if( n < 1 ) return ret;
vector<int> visited;
dfs(n, 0, visited, ret);
return ret;
}
private:
void dfs(int n, int cur, vector<int>& visited, vector<vector<string>>& ans){
if( cur == n ){
vector<string> solution;
for(int i = 0; i < n; ++i){
int loc = visited[i];
string s;
for(int j = 0; j < n; ++j){
if( j == loc ) s.push_back('Q');
else s.push_back('.');
}
solution.push_back(s);
}
ans.push_back( solution );
}
else{
for(int k = 0; k < n; ++k){
if(valid( cur, k, visited )){
visited.push_back( k );
dfs( n, cur+1, visited, ans );
visited.pop_back();
}
}
}
}// dfs
bool valid( int x, int y, vector<int>& visited ){
int sz = visited.size();
for( int u = 0; u < sz; ++u ){
int v = visited[u];
// same column
if( y == v ) return false;
// same diag
if( abs(x-u) == abs(y-v) ) return false;
}
return true;
}// valid
};