首页 > 编程语言 >代码随想录算法训练营第三十天 | 51.N 皇后

代码随想录算法训练营第三十天 | 51.N 皇后

时间:2024-06-07 17:11:24浏览次数:15  
标签:return int 随想录 训练营 51 col vector chessBoard row

51.N 皇后

题目链接 文章讲解 视频讲解

递归三部曲

  • 递归函数参数
    需要传入当前chessBoard和棋盘大小n,以及当前要放置皇后的行数row
    void backtracking(vector<string>& chessBoard, int n, int row);
    
  • 递归终止条件
    当最后一个皇后放置好后结束
    if(row == n) {
        result.push_back(chessBoard);
        return ;
    }
    
  • 单层递归逻辑
    层间遍历为棋盘行数,层内遍历为棋盘列数
    判断是否是合适的位置,合适则放置皇后,否则继续递归搜索
    for (int col = 0; col < n; col++) {
        if (isValid(row, col, chessboard, n)) { // 验证合法就可以放
            chessboard[row][col] = 'Q'; // 放置皇后
            backtracking(n, row + 1, chessboard);
            chessboard[row][col] = '.'; // 回溯,撤销皇后
        }
    }
    

整体代码如下:

class Solution {
private:
    vector<vector<string>> result;
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<string> chessBoard(n, string(n, '.'));
        backtracking(chessBoard, n, 0);
        return result;
    }

    void backtracking(vector<string>& chessBoard, int n, int row) {
        
        // 终止条件,回收结果
        if(row == n) {
            result.push_back(chessBoard);
            return ;
        }

        for(int i = 0; i < n; ++i) {
            if(isValid(chessBoard, n, row, i)) {
                chessBoard[row][i] = 'Q';
                backtracking(chessBoard, n, row + 1);
                chessBoard[row][i] = '.';
            }
        }
    }

    bool isValid(vector<string>& chessBoard, int n, int row, int col) {
        // 检查列
        for(int i = 0; i < row; ++i) {
            if(chessBoard[i][col] == 'Q') return false;
        }
        // 检查45°角
        for(int i = row - 1, j = col - 1; i >= 0 && j >= 0; --i, --j) {
            if(chessBoard[i][j] == 'Q') return false;
        }
        // 检查135°角
        for(int i = row - 1, j = col + 1; i >= 0 && j < n; --i, ++j) {
            if(chessBoard[i][j] == 'Q') return false;
        }
        return true;
    }
};

标签:return,int,随想录,训练营,51,col,vector,chessBoard,row
From: https://www.cnblogs.com/cscpp/p/18237538

相关文章

  • 基于51单片机煤气天然气CO检测报警器排气风扇断气
    **单片机设计介绍,基于51单片机煤气天然气CO检测报警器排气风扇断气文章目录一概要二、功能设计设计思路三、软件设计原理图五、程序六、文章目录一概要  基于51单片机煤气天然气CO检测报警器排气风扇断气系统概要如下:一、系统概述本系统旨在利用51单片......
  • Codeforces Round 951 (Div. 2)
    A.GuesstheMaximum题意:给定一个数组,求一个k值,k满足对于任意的这个数组的区间的最大值max,k<max。求满足条件的最大k。思路:只考虑长度为2的区间即可。参与到比较中的数值一定是两个数中的大数,从所有大数中选出最小的一个即可。总结:赛时很快就A掉了,但是思考的不够细节,思维太......
  • 代码随想录算法训练营第七天 | 四数之和、赎金信、三数之和、四数之和2
    代码随想录算法训练营第七天383赎金信https://leetcode.cn/problems/ransom-note/submissions/537782865/383赎金信代码随想录https://programmercarl.com/0383.赎金信.html#思路四数之和2https://leetcode.cn/problems/4sum-ii/四数之和2代码随想录https://programmerca......
  • 代码随想录算法训练营第八天 | 字符串:344反转字符串、
    反转字符串https://leetcode.cn/problems/reverse-string/反转字符串代码随想录https://programmercarl.com/0344.反转字符串.html#算法公开课反转字符串题目编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外......
  • AI大模型微调训练营,全面解析微调技术理论,掌握大模型微调核心技能
    AI大模型微调训练营:深度解析微调技术,掌握核心技能一、引言随着人工智能技术的飞速发展,大型预训练模型(如GPT、BERT、Transformer等)已成为自然语言处理、图像识别等领域的核心工具。然而,这些大模型在直接应用于特定任务时,往往无法直接达到理想的性能。因此,微调(Fine-tuning)技术应运......
  • CodeForces Round #951(Div. 2) 补题记录(A~D)
    A容易发现对于任意一个长度为\(n\),下标从\(1\)开始的序列\(a\),若\(1\lel\ler<n\),则必然有\(\max\limits_{i=l}^ra_i\le\max\limits_{i=l}^{r+1}a_i\)。若\(1<l\ler\len\),则必然有\(\max\limits_{i=l}^ra_i\le\max\limits_{i=l-1}^ra_i\)。很显然Bob希望......
  • 代码随想录算法训练营 第三天 链表 Leetcode203 移除链表元素 Leetcode707 设计链表 L
    Leetcode203移除链表元素 题目链接注意为了使后续节点方式统一 要人为设置链表头节点链表的处理一定要明白如何找前置节点/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*L......
  • 代码随想录算法训练营第30天 | 332.重新安排行程 、51. N皇后、37. 解数独
    332.重新安排行程(可跳过)https://programmercarl.com/0332.重新安排行程.html有难度,涉及到图,有些用例会超时/***@param{string[][]}tickets*@return{string[]}*/varfindItinerary=function(tickets){constres=['JFK'];constmap={};for(le......
  • 代码随想录第2天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,数组总结
    题目:977.有序数组的平方思路:first.for循环,平方,然后sort排序,提交通过啊哈~|但时间复杂度大O(n+nlogn),->O(nlogn)的时间复杂度,题目进阶要求时间复杂度为O(n)second.双指针。题目为有序数组,包含负数,则平方后,最大值在数组的两头,则使用双指针进行,两个比较大小,大的存入新......
  • 代码随想录算法训练营第二十九天 | 491.非递减子序列
    491.非递减子序列题目链接文章讲解视频讲解层间去重:回溯法相当于深搜,所以所以是一直递归到叶节点才开始回溯;每次进入backtracking也就进入了搜索树的下一层,所以每进入一层需要用一个used_set来记录使用过的元素;classSolution{private:vector<int>sub;vecto......