【LeetCode】51和52.N皇后

  • N皇后

  1. 题目描述

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

    【LeetCode】51和52.N皇后_第1张图片

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

    给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

  2. 思路

    回溯中最经典的问题。这里简单总结下回溯的写法:

    首先,通常需要一个记录所有满足条件结果的容器,在下面的代码中就是参数res;

    其次,需要一个容器来记录当前回溯的路径,在下面的代码中就是参数nQueens;

    最后,就是需要记录当前搜索的位置,即row;以及终止条件,即n;

    该题目中没有剪枝条件,但是回溯有时会遇到需要剪枝的情况;

    详细的理解,请见下方代码:

  3. C++实现
class Solution {
public:
    vector> solveNQueens(int n) {
        vector> res;
        vector nQueens(n,string(n,'.')); //n个字符串,每个字符串是n个'.'组成
        solveNQueens(res, nQueens, 0, n);
        return res;
    }
    /**
    res:用于存储所有的解决方案
    nQueens:用于存储当前的解决方案
    row:当前解决方案所扫描的行
    n:行/列数
    **/
    void solveNQueens(vector> &res,
                      vector &nQueens,int row,int n){
        if(row==n){//row的合理位置在[0,n-1],当其为n时表示已经扫描完整个棋盘
            res.push_back(nQueens);
            return;
        }
        for(int col = 0;col &nQueens, int row, int col, int n){
        // 检查当前列在先前的行中是否已经放置了Q
        for (int i = 0; i= 0 && j >= 0; --i, --j)
            if (nQueens[i][j] == 'Q')
                return false;
        // 检查前面的135度角
        for (int i = row - 1, j = col + 1; i >= 0 && j < n; --i, ++j)
            if (nQueens[i][j] == 'Q')
                return false;
        return true;
    }
};

 

  • N皇后II

  1. 题目描述

    类似于上面的题目,只不过变为返回可能的方案数量,而不是所有的方案。

  2. 思路

    类似于上面的题目,只不过不需要记录所有的方案,因此不需要res,只使用整型变量count来记录结果。

  3. C++实现
class Solution {
public:
    int totalNQueens(int n) {
        int count = 0;
        vector nQueens(n,string(n,'.'));
        solveNQueens(count,nQueens,0,n);
        return count;
    }
    // &n?
    void  solveNQueens(int& count,vector nQueens,int row,int n){
        if(row==n){//终止条件
            count++;
            return;
        }
        for(int col=0;col &nQueens, int row, int col, int n){
        // 检查当前列在先前的行中是否已经放置了Q
        for (int i = 0; i= 0 && j >= 0; --i, --j)
            if (nQueens[i][j] == 'Q')
                return false;
        // 检查前面的135度角
        for (int i = row - 1, j = col + 1; i >= 0 && j < n; --i, ++j)
            if (nQueens[i][j] == 'Q')
                return false;
        return true;
    }
};

 

你可能感兴趣的:(Leetcode,C++,N皇后,回溯,leetcode)