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

相关推荐
傅科摆 _ py13 小时前
动态规划复习
算法·动态规划
Wang's Blog13 小时前
PostgreSQL笔记49:向量检索核心算法、索引调优与过滤策略深度解析
笔记·算法·postgresql
疯狂打码的少年13 小时前
【数据结构】交换类排序:冒泡与快速排序
数据结构·笔记·算法·排序算法
Nil20814 小时前
leetcode 108有序数组转换为二叉搜索树
数据结构·算法·leetcode
高频因子挖掘机14 小时前
QuantDash 成交量单位统一实战:从“手”到“股”的跨市场量化数据清洗全流程
后端·算法·github
hn小菜鸡14 小时前
LeetCode 763、划分字母区间
数据结构·算法·leetcode
Escalating_xu14 小时前
【C++ STL简介】从六大组件到容器、迭代器与算法协作
java·c++·算法
纪念 22915 小时前
算法二叉树(一)
算法
liulilittle15 小时前
llmx 学习手册 06 —— CPU 指令集优化(AVX-512 三层演进)
c++·学习·算法·ai·llm
土司大王16 小时前
LeetCode hot100——相交链表
算法·leetcode·链表