LeetCode 51. N皇后(C++)

题目描述:

皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

LeetCode 51. N皇后(C++)_第1张图片

上图为 8 皇后问题的一种解法。

给定一个整数 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

LeetCode 51. N皇后(C++)_第2张图片

欢迎大家指教。

 

你可能感兴趣的:(LeetCode递归回溯)