[力扣题解]51. N皇后

题目:51. N皇后

思路

回溯法

代码

cpp 复制代码
class Solution {
public:
    vector<vector<string>> result;
    bool right(int row, int col, int n, vector<string>& board)
    {
        int i, j;
        // 不能同行, 这里我又没有写错,为什么结果不对呢?
        // `不能同行` 其实可以不需要判断
        for(j = 0; j < col; j++)
        {
            if(board[row][j] == 'Q')
            {
                return false;
            }
        }
    
        // 不能同列
        for(i = 0; i < row; i++)
        {
            if(board[i][col] == 'Q')
            {
                return false;
            }
        }
        // 不能同一斜线
        
        /* (1)
            \
             \
              \
        */
        for(i = row-1, j = col-1; i >= 0 && j >= 0;i--, j--)
        {
            if(board[i][j] == 'Q')
            {
                return false;
            }
        }
        /* (2)
             /
            /
           /
        */
        for(i = row-1, j = col+1; i >= 0 && j < n; i--, j++)
        {
            if(board[i][j] == 'Q')
            {
                return false;
            }
        }
        return true;
    }

    void function(int n, int row, vector<string>& board)
    {
        if(row == n)
        {
            result.push_back(board);
            return;
        }
        int i;
        
        // i : 列 
        for(i = 0; i < n; i++)
        {
            if(right(row, i, n, board))
            {
                board[row][i] = 'Q';
                function(n, row+1, board);
                board[row][i] = '.';
            }
        }
        return;
    }

    vector<vector<string>> solveNQueens(int n) {
        result.clear();
        std::vector<std::string> board(n, std::string(n, '.'));
        function(n, 0, board);
        return result;
    }   
};

其中判断合法性的时候,"不能同行"其实可以不用写,因为这是在递归过程中,只会选取for循环里一个元素,接下来就递归到下一层去了(下一行),所以可以不用判断"不能同行";

注意:在通常回溯法写path的地方改成了board(就改了个名字),当成二维数组来对待;

同时二位数组大小和棋盘相等,不可以像以往为了图省事故意创建一个大一点的数组(比如一般会凑整数,n=6,直接int path[10];

相关推荐
YuTaoShao38 分钟前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
二进制person5 小时前
Java SE--方法的使用
java·开发语言·算法
OneQ6665 小时前
C++讲解---创建日期类
开发语言·c++·算法
JoJo_Way5 小时前
LeetCode三数之和-js题解
javascript·算法·leetcode
.30-06Springfield6 小时前
人工智能概念之七:集成学习思想(Bagging、Boosting、Stacking)
人工智能·算法·机器学习·集成学习
凌肖战8 小时前
力扣网C语言编程题:在数组中查找目标值位置之二分查找法
c语言·算法·leetcode
weixin_478689768 小时前
十大排序算法汇总
java·算法·排序算法
luofeiju9 小时前
使用LU分解求解线性方程组
线性代数·算法
SKYDROID云卓小助手9 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理
ysa0510309 小时前
数论基础知识和模板
数据结构·c++·笔记·算法