数组col[row] = i表示当前行row对应可以放置皇后的列i
解法用的回溯
class Solution {
public:
vector<vector<string> > solveNQueens(int n) {
if( n <= 0)
return vector< vector< string> >();
int col[n];
vector< vector< string> > res;
queens( col, 0, n, res);
return res;
}
void queens( int * col, int row, int n, vector< vector< string> > &res){
if( row == n){
push(col, res, n);
return;
}
for( int i = 0; i < n; ++i){
col[row] = i;
bool flag = true;
for( int j = 0; j < row; ++j){
if( col[row] == col[j] || col[row] - col[j] == row - j || col[row] - col[j] == j - row){
flag = false;
break;
}
}
if(flag)
queens( col, row+1, n, res);
}
}
void push( int * col, vector< vector< string> > &res, int n){
vector< string> temp;//这里不能初始化,不然会有初始化值
for( int i = 0; i < n; ++i){
string str = "";
for( int j = 0; j < n; ++j){
if( col[i] == j)
str += 'Q';
else
str += '.';
}
temp.push_back(str);
}
res.push_back(temp);
}
};