Day12(回溯法)——LeetCode51.N皇后39.组合总和

news2025/7/16 17:32:35

1 前言

  今天刷了三道回溯法和一道每日推荐,三道回溯法也迷迷糊糊的,每日推荐把自己绕进去了,虽然是一道之前做过的题的变种。刷的脑子疼。。。今天挑两道回溯题写一下吧,其中有一道是之前做过的N皇后,今天在详细写一写。

2 LeetCode51.N皇后(LeetCode)

2.1 题目描述

  题目描述如下:
1
  示例如下:
2

2.2 题目分析及解决

  思路大概就是从第一行的第一列开始放置皇后,然后递归下一行,直到找到第一个皇后在第一行第一列的所有解,然后回溯到第一行,进行第二列的搜索。
  这里用vector<string> path记录每个解,定义queue(int row,int n)来找第row行合法的皇后位置,n是总行数。当我们找到第n行时,且能找到解,则将该结果保存到答案中,然后返回,寻求其他解。
  尝试把皇后放在该行的每一列中,若与之前的皇后放置位置没有冲突,则放置皇后。这里就发现,我们需要一个数组来保存之前皇后放置的位置。设state[i]=j,表示第i行皇后放在第j列,因此每次放置皇后,都只需要检验其与之前的行的皇后有无矛盾即可,将在同一列,对角线以及反对角线的情况写出来,观察下标可以很容易进行判断:

bool conflict(int r,int j){
        for(int i=0;i<r;i++){
            if(state[i]==j||(abs(state[i]-j)==abs(r-i))){
                return true;
            }
        }
        return false;
    }

  当递归找下一行后,需要在其递归返回后恢复现场,即将statepath恢复原始状态。
  完整代码如下:

#include<string>
#include<vector>
class Solution {
public:
    vector<vector<string>> ans;
    vector<string> path;
    vector<int> state;

    bool conflict(int r,int j){
        for(int i=0;i<r;i++){
            if(state[i]==j||(abs(state[i]-j)==abs(r-i))){
                return true;
            }
        }
        return false;
    }
    void queue(int row,int n){
        if(row==n){
            ans.push_back(path);
            return;
        }
        for(int j=0;j<n;j++){
            if(!conflict(row,j)){
                //记录当前行皇后的位置
                state[row]=j;
                //放置皇后
                path[row][j]='Q';
                queue(row+1,n);
                //回溯
                path[row][j]='.';
                state[row]=-1;

            }
        }
    }
    vector<vector<string>> solveNQueens(int n) {
        path=vector<string>(n,string(n,'.'));
        state=vector<int>(n,-1);
        queue(0,n);
        return ans;
    }
};

3 LeetCode39.组合总和(LeetCode39)

3.1 题目描述

  题目描述如下:
3
  具体实例如下:
4

3.2 题目分析及解决

  感觉好像是重复背包问题(有点记不清了)。思路大概都好想,假设现在判断是否使用第i个数,若使用nums[i]后,其仍没超过target,则可以继续从第i个数进行递归(即再次判断能否使用nums[i]);若超过了target,则需要尝试使用别的数,若其余数都不符合,则回溯到第i个数前,尝试使用别的数。这里注意到,如果我们提前将数组进行排序,则当使用nums[i]后超过target后,则nums[i]后面的数也一定不能使用,从而提前结束递归(剪枝)。
  具体代码如下:

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> path;
    void dfs(vector<int>& candidates,int target,int i){
        //找到正确解,放入结果
        if(target==0){
            ans.push_back(path);
            return;
        }
        //若当前和大于target,返回,递归会尝试放下一个元素
        if(target<0) return;

        for(int start=i;start<candidates.size();start++){
            //不断放入第i个元素
            if(target-candidates[start]>=0){
                path.push_back(candidates[start]);
                //递归处理,可重复使用元素,因此下一次开始仍然是start
                dfs(candidates,target-candidates[start],start);
                //回溯,移除当前解,尝试其他可能
                //target隐式的回溯,因为其是函数变量
                path.pop_back();
            }
        }
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        dfs(candidates,target,0);
        return ans;
    }
};

4 感想

  想理解回溯,感觉重要的是理解递归,递归猛一看感觉还不错,但是当其在语句中运行时,往往分不清什么时候运行哪一句,什么时候运行下一句,返回时哪些变量恢复到递归前的值,哪些变量需要自己手动回溯等等。
  还需要自己手动画一下递归树,以及剪枝的过程,回溯的过程。此外在设计函数时也需要仔细思考,好的函数往往能事半功倍。总之自己对回溯对递归理解的还远远不够。。。真的头大。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2343903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣HOT100——102.二叉树层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] /*** Definition for a bi…

搭建基于火灾风险预测与防范的消防安全科普小程序

基于微信小程序的消防安全科普互动平台的设计与实现&#xff0c;是关于微信小程序的&#xff0c;知识课程学习&#xff0c;包括学习后答题。 技术栈主要采用微信小程序云开发&#xff0c;有下面的模块&#xff1a; 1.课程学习模块 2.资讯模块 3.答题模块 4.我的模块 还需…

RAG技术与应用---0426

大语言模型>3.10 课程中会用到python 工具箱&#xff1a; faiss,modelscope,langchain,langchain_community&#xff0c;PyPDF2 1&#xff09;大模型应用开发的三种模式 提示词没多少工作量&#xff0c;微调又花费时间费用&#xff0c;RAG是很多公司招聘用来对LLM进行应用…

element-ui多个form同时验证,以及动态循环表单注意事项

多个form同时验证&#xff1a; validateForm(refs) {if (!refs) {return false}return new Promise((resolve, reject) > {refs.validate().then((valid) > {resolve(valid)}).catch((val) > {resolve(false)})}) }, async handleConfirm() {Promise.all([this.valid…

k8s学习记录(四):节点亲和性

一、前言 在上一篇文章里&#xff0c;我们了解了 Pod 中的nodeName和nodeSelector这两个属性&#xff0c;通过它们能够指定 Pod 调度到哪个 Node 上。今天&#xff0c;我们将进一步深入探索 Pod 相关知识。这部分内容不仅信息量较大&#xff0c;理解起来也有一定难度&#xff0…

文本预处理(NLTK)

1. 自然语言处理基础概念 1.1 什么是自然语言处理 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于…

Neo4j 可观测性最佳实践

Neo4j 介绍 Neo4j 是一款领先的图数据库管理系统&#xff0c;采用图数据模型来表示和存储数据。它以节点、关系和属性的形式组织数据&#xff0c;节点代表实体&#xff0c;关系表示节点间的连接&#xff0c;属性则为节点和关系附加信息。Neo4j 使用 Cypher 查询语言&#xff0…

【教程】Windows通过网线共享网络给其它设备

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、打开“控制面板”。 2、点击“网络和共享中心”。 3、点击“更改适配器设置”。 4、选中要共享的网络适配器&#xff0c;右击选中“属性”。 5、勾选…

百度AI开发者大会:连发多款AI应用,覆盖AI数字人等热门赛道

4月25日&#xff0c;Create2025百度AI开发者大会在武汉隆重举办。百度创始人李彦宏发表了题为《模型的世界 应用的天下》的演讲。60分钟的演讲中&#xff0c;李彦宏发布了两大模型&#xff0c;多款热门AI应用&#xff0c;并宣布将帮助开发者全面拥抱MCP。 当天发布的文心大模型…

Java 线程的六种状态与完整生命周期详解

&#x1f680; Java 线程的几种状态详解 在 Java 中&#xff0c;线程状态&#xff08;Thread State&#xff09;是由 Thread.State 枚举定义的&#xff0c;总共有六种&#xff1a; 状态含义典型场景示例NEW新建状态&#xff0c;线程对象刚创建&#xff0c;还未调用 start() 方…

05--Altium Designer(AD)的详细安装

一、软件的下载 Altium Designer官网下载 1、临近五一的假期&#xff0c;想着搞个项目&#xff0c;且这个项目与PCB有关系&#xff0c;所以就下这个软件来玩玩。下面保姆级教大家安装。 2、选择适合自己的版本下载&#xff08;我安装的是24的&#xff09; 3、软件安装 1.下…

Java 队列与阻塞队列全面解析:从 Queue 到 TransferQueue 的实现与应用

文章目录 Queue队列QueueDeque 阻塞队列BlockingQueueArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueueSynchronousQueueDelayQueue BlockingDequeLinkedBlockingDeque TransferQueueLinkedTransferQueue Queue Queue&#xff08;队列&#xff09;是一种特殊的线性…

【蓝桥杯省赛真题56】Scratch抓不住的蜜蜂 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch抓不住的蜜蜂 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 四、程序编写 五、考点分析 六、推荐资料 1、scratch资料 2、python资料 3、C++资料 scratch抓不住的蜜蜂 第十五届青少年蓝桥…

《TCP/IP详解 卷1:协议》之第七、八章:Ping Traceroute

目录 一、ICMP回显请求和回显应答 1、ICMP回显请求 2、ICMP回显应答 二、ARP高速缓存 三、IP记录路由选项&#xff08;Record Route&#xff0c;RR&#xff09; 1、记录路由选项的工作过程 2、RR 选项的 IP 头部格式 2.1、RR 请求 2.2、RR响应 四、ping 的去返路径 五…

NtripShare 2025第一季度主要技术进展

GNSS方面 1、开源GNSS接收机配置软件基础版本。 2、商业版本GNSS接收机配置软件&#xff0c;增加PPP、文件保存、前端解算&#xff08;静态、RTK-Static&#xff09;&#xff0c;前端坐标转换。 3、GNSS接收机配置软件全面适配米尔T133i硬件方案。 视觉检测方面 1、做出第…

头歌实训之存储过程、函数与触发器

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…

【华为】防火墙双击热备-之-主备模式-单外网线路-分享

FW1和FW2的业务接口都工作在三层&#xff0c;上行连接二层交换机。上行交换机连接运营商的接入点&#xff0c;运营商为企业分配的IP地址为100.100.100.2。现在希望FW1和FW2以主备备份方式工作。正常情况下&#xff0c;流量通过FW1转发&#xff1b;当FW1出现故障时&#xff0c;流…

川翔云电脑32G大显存集群机器上线!

川翔云电脑今日重磅推出32G 大显存机型&#xff0c;为游戏玩家、设计师、AI 开发者等提供极致云端算力体验&#xff01; 一、两大核心配置&#xff0c;突破性能天花板 ✅ 32G 超大显存机型 行业领先&#xff1a;搭载 NVIDIA 专业显卡&#xff0c;单卡可分配 32G 独立显存&am…

加里·基尔代尔:CP/M之父与个人计算时代的先驱

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 加里基尔代尔&#xff1a;CP/M之父与个人计算时代的先驱 一、早年生活与教育背景 1.…

静态多态和动态多态的区别

C多态机制深度解析 多态是面向对象编程的核心特性&#xff0c;允许通过统一接口执行不同实现。在C中&#xff0c;多态表现为基类指针或引用调用虚函数时&#xff0c;根据实际对象类型执行对应派生类的函数逻辑。 基础实现示例 定义基类与派生类&#xff0c;演示动态绑定…