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

相关推荐
CoovallyAIHub17 小时前
OpenClaw 近 2000 个 Skills,为什么没有一个好用的视觉检测工具?
深度学习·算法·计算机视觉
CoovallyAIHub17 小时前
CVPR 2026 | 用一句话告诉 AI 分割什么——MedCLIPSeg 让医学图像分割不再需要海量标注
深度学习·算法·计算机视觉
CoovallyAIHub17 小时前
Claude Code 突然变成了 66 个专家?这个 5.8k Star 的开源项目,让我重新理解了什么叫"会用 AI"
深度学习·算法·计算机视觉
兆子龙17 小时前
前端哨兵模式(Sentinel Pattern):优雅实现无限滚动加载
前端·javascript·算法
xlp666hub20 小时前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
CoovallyAIHub21 小时前
9个视觉语言模型工厂实测:Qwen 87.9%碾压全场,你的显卡能跑哪个?
算法
SparkX开源AI知识库21 小时前
手摸手带你安装OpenClaw并对接飞书
算法·架构
一语071621 小时前
3分钟搞懂深度学习AI:实操篇:卷积层
人工智能·算法
CoovallyAIHub2 天前
181小时视频丢给GPT-5,准确率只有15%——南大联合NVIDIA等五校发布多模态终身理解数据集
深度学习·算法·计算机视觉