[力扣题解]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];

相关推荐
田梓燊6 小时前
力扣:23.合并 K 个升序链表
算法·leetcode·链表
re林檎7 小时前
算法札记——4.27
算法
数据牧羊人的成长笔记7 小时前
逻辑回归与Softmax回归
算法·回归·逻辑回归
郑州光合科技余经理8 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
d111111111d11 小时前
STM32-UART封装问题解析
笔记·stm32·单片机·嵌入式硬件·学习·算法
Jiangxl~12 小时前
IP数据云如何为不同行业提供精准IP查询与风险防控解决方案?
网络·网络协议·tcp/ip·算法·ai·ip·安全架构
李伟_Li慢慢13 小时前
wolfram详解山峦算法
前端·算法
counting money13 小时前
prim算法最小生成树(java)
算法
澈20713 小时前
C++面向对象:类与对象核心解析
c++·算法
用户6906738819213 小时前
基于无人机的单目测距系统,平均误差仅2.12%
算法