n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
这是一道典型的用回溯法题:每行可放一个皇后,用递归对每一行进行放置,放置时,按照列顺序寻找可以放置皇后的列,若可以放置皇后,将皇后放置在该位置,并更新mark标记数组,递归进行下一行的皇后放置,当递归结束后,恢复mark 数组,并尝试下一个可能放置皇后的列。
class Solution {
public:
void put_down_the_queen(int x,int y,vector> &mark){
static const int dx[]={-1,1,0,0,-1,-1,1,1};//方向数组
static const int dy[]={0,0,-1,1,-1,1,-1,1};
mark[x][y]=1;//(x,y)放置皇后,进行标记
for(int i=1;i=0&&new_x=0&&new_y& location ,vector>&result,vector>& mark){
if (k==n){//完成了0---n-1行的
result.push_back(location);
return ;
}
for(int i=0;i> tmp_mark=mark;//用来记录状态,以便回溯;
location[k][i]='Q';
put_down_the_queen(k,i,mark);
generate(k+1,n,location,result,mark);//递归进行下一层
mark=tmp_mark;
location[k][i]='.';//将当前的皇后位置重置.
}
}
}
//k代表完成了几个皇后的放置
//location 某次结果存储在location
//result最后结果的存储
//mark表示棋盘的标记
vector> solveNQueens(int n) {
vector location;
vector> result;
vector> mark;
for(int i=0;i()));
for(int j=0;j
欢迎大家指教。