//<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">解题思路:</span><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">使用回溯法解决N皇后问题,是常见的解决方法。分N步放置皇后,由于皇后之间不能同行、同列、同斜线,所以每次放置皇后的时候,都要考虑是///否与已有的皇后“冲突”,如果冲突,则改变位置,直至所有皇后放置完毕。</span>
class Solution {
public:
vector<vector<string> > solveNQueens(int n) {
vector<int> pos_queen(n,-1);
vector<string> solution(n,string(n,'.'));
N_queen(0, n, pos_queen, solution);
return result;
}
//回溯,因为每一行只能有一个皇后,所以position[index]表示第index个皇后的所在的列数col,然后从第一行的皇后开始找出合法的位置
void N_queen(int index, int n, vector<int> &pos_queen, vector<string> &solution){
for(int col = 0; col < n; col++){
if(check_pos_valid(index,col,pos_queen)){
pos_queen[index] = col;
solution[index][col] = 'Q';
if(index == n-1){//到了最后一行
result.push_back(solution);//输出结果
solution[index][col] = '.';//回溯
pos_queen[index] = 0;//回溯
return;
}
N_queen(index+1, n, pos_queen, solution);//下一行的皇后的位置
solution[index][col] = '.';//回溯
pos_queen[index] = 0;//回溯
}
}
}
//判断该位置合不合法
bool check_pos_valid(int index, int col, vector<int> &pos_queen){
int data;
for(int i = 0; i < index; i++){
data = pos_queen[i];//pos_queen数组的设置保证了每一个皇后肯定在不同行上了,所以只需要判断皇后在不在同一列或者同一对角线上
if( data == col)//判断是否在同一列
return false;
if( (data - col) == (i - index))//判断是否在对角线上
return false;
if( (data - col) == (index - i))
return false;
}
return true;
}
private:
vector< vector<string> > result;
};