【刷题篇】回溯算法(广度优先搜索(一))

news2025/7/14 17:34:39

文章目录

  • N 叉树的层序遍历
  • 腐烂的橘子
  • 单词接龙
  • 打开转盘锁

N 叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        vector<vector<int>> allset;
        queue<Node*> curset;
        if(root!=nullptr)
            curset.push(root);
        while(!curset.empty())
        {
            int size=curset.size();
            vector<int> part;
            while(size--)
            {
                Node* cur=curset.front();
                part.push_back(cur->val);
                curset.pop();
                for(Node* e : cur->children)
                {
                    curset.push(e);
                }
            }
            allset.push_back(part);
        }
        return allset;
    }
};

腐烂的橘子

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
在这里插入图片描述

class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        queue<pair<int,int>> curset;
        int row=grid.size();
        int col=grid[0].size();
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                if(grid[i][j]==2)
                {
                    curset.push(make_pair(i,j));
                    //break;
                    //这里并不能找到一个就返回,实例【2,2,2,1,1】,就会出错
                }
            }
        }
        int time=0;
        int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
        while(!curset.empty())
        {
            int size=curset.size();
            bool flag=false;//这里的标记是非常有作用的,只有为true之后时间才会增加
            while(size--)
            {
                pair<int,int> cur=curset.front();
                curset.pop();
                //遍历烂橘子的周围
                for(int i=0;i<4;i++)
                {
                    int newrow=cur.first+next[i][0];
                    int newcol=cur.second+next[i][1];
                    if(newrow>=row||newrow<0||newcol>=col||newcol<0)
                        continue;
                    if(grid[newrow][newcol]==1)
                    {
                        grid[newrow][newcol]=2;
                        flag=true;
                        curset.push(make_pair(newrow,newcol));
                    }   
                }
            }
            if(flag)
                time++;  
        }
        //遍历一次是否还有好橘子
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                if(grid[i][j]==1)
                {
                    return -1;
                }
            }
        }
        return time; 
    }
};

单词接龙

在字典(单词列表) wordList 中,从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:
序列中第一个单词是 beginWord 。
序列中最后一个单词是 endWord 。
每次转换只能改变一个字母。
转换过程中的中间单词必须是字典 wordList 中的单词。
给定两个长度相同但内容不同的单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。

在这里插入图片描述

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        queue<string> q;
        unordered_set<string> book;
        unordered_set<string> newword;//将wordlist导入更加的方便
        int step=1;//因为开始也是算成一个步骤
        //导入原数据
        for(auto& e : wordList)
            newword.insert(e);
        q.push(beginWord);
        book.insert(beginWord);//开始要记住要把beginWord放入标记数组
        while(!q.empty())
        {
            int size=q.size();
            while(size--)
            {
                string cur=q.front();
                q.pop();
                if(cur==endWord)//相等就直接返回就可以了
                    return step;
                for(int j=0;j<cur.size();j++)
                {   //这里是必须要创建一个新值的,因为下面会改变cur的值,
                    //导致在遍历下一个字母时会出现问题
                    string str=cur;
                    for(char i='a';i<='z';i++)
                    {
                        str[j]=i;
                        //确保不在标记数组当中,也要确保要在词典当中找到
                        if(book.find(str)==book.end()&&newword.find(str)!=newword.end())
                        {
                            q.push(str);
                            book.insert(str);
                        }
                    }
                }
            }
            step++;
        }
        return 0;
    }
};

打开转盘锁

一个密码锁由 4 个环形拨轮组成,每个拨轮都有 10 个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。
锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。
列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。
字符串 target 代表可以解锁的数字,请给出解锁需要的最小旋转次数,如果无论如何不能解锁,返回 -1 。
在这里插入图片描述

class Solution {
public:
    int openLock(vector<string>& deadends, string target) {
        unordered_set<string> Deadends(deadends.begin(), deadends.end());//使用set更加的方便
        unordered_set<string> book;//作为标记手册
        queue<string> bfs;
        int step=0;
        if (target == "0000") return 0;
        //如果在死亡数组中找到“0000”就直接返回-1
        if(Deadends.find("0000")!=Deadends.end())
        {
            return -1;
        }
        bfs.push("0000");
        book.insert("0000");
        while(!bfs.empty())
        {
            int size=bfs.size();
            while(size--)
            {
                string cur=bfs.front();
                bfs.pop();
                if(cur==target)
                {
                    return step;
                }
                for(int i=0;i<cur.size();i++)
                {
                    //储存两个变量,用于记录是向下滚动还是向上
                    string tmp1=cur;
                    string tmp2=cur;
                    if(tmp1[i]=='9')
                    {
                        tmp1[i]='0';
                    }
                    else
                    {
                        tmp1[i]++;
                    }
                    if(tmp2[i]=='0')
                    {
                        tmp2[i]='9';
                    }
                    else
                    {
                        tmp2[i]--;
                    }
                    //判断标记数组是否有,判断死亡数组是否有
                    if(book.find(tmp1)==book.end()&&Deadends.find(tmp1)==Deadends.end())
                    {
                        book.insert(tmp1);
                        bfs.push(tmp1);
                    }
                    if(book.find(tmp2)==book.end()&&Deadends.find(tmp2)==Deadends.end())
                    {
                        book.insert(tmp2);
                        bfs.push(tmp2);
                    }  
                }
            }
            step++;
        }
        return -1;
    }
};

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

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

相关文章

AADL 端到端流延迟分析示例项目 Latency-case-study 简述

一、项目概述 latency-case-study 项目是一个增量延迟分析系统。该系统从系统的总体框架开始&#xff0c;逐步迭代增进&#xff0c;最终建立起系统的模型并实现对模型的分析。&#xff08;个人觉得这个过程有一些类似于“自顶向下&#xff0c;逐步求精”的过程&#xff09; 示…

它来了,xhadmin多应用Saas框架正式发布!

这是一个很激动人心的时刻&#xff0c;因为这个框架从立项到现在已经一年多的时间了&#xff0c;先给大家欣赏下颜值吧。 上图所示是总后台的首页截图&#xff0c;看上去还是比较满意的&#xff0c;不过后续还有一些小小的调整。 应用市场的效果也是相当炸裂的&#xff0c;整体…

Windows10找不到msvcr100.dll如何修复呢?详细有效的修复方法分享

在使用Windows10操作系统的过程中&#xff0c;我们经常会遇到各种各样的技术问题。其中&#xff0c;一些常见的问题是关于系统文件丢失或损坏&#xff0c;如“找不到msvcr100.dll”的错误。这个问题在Windows 10系统中尤其常见&#xff0c;msvcr100.dll是一个动态链接库文件&am…

用友NC-Cloud uploadChunk 任意文件上传漏洞

一、漏洞描述 用友 NC Cloud&#xff0c;大型企业数字化平台&#xff0c; 聚焦数字化管理、数字化经营、数字化商业&#xff0c;帮助大型企业实现 人、财、物、客的全面数字化&#xff0c;从而驱动业务创新与管理变革&#xff0c;与企业管理者一起重新定义未来的高度。为客户提…

收集灵感都有哪些网站推荐?

设计是一件非常令人兴奋的事情。特别是最常见的平面设计&#xff0c;作为一种传达想法或信息的视觉表达形式&#xff0c;被要求不仅突出个性和主题&#xff0c;而且具有创造力和美感&#xff0c;使许多设计师在灵感枯竭时疯狂。此时&#xff0c;浏览一些平面设计网站&#xff0…

YOLOv8涨点技巧:手把手教程,注意力机制如何在不同数据集上实现涨点的工作,内涵多种网络改进方法

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;手把手教程&#xff0c;解决注意力机制引入到YOLOv8在自己数据集不涨点的问题点&#xff0c;本文提供五种改进方法来解决此问题&#xff1b; ContextAggregation | 亲测在血细胞检测项目中涨点&#xff0c;…

C/C++文件操作(细节满满,part2)

该文章上一篇&#xff1a;C/C文件操作&#xff08;细节满满&#xff0c;part1&#xff09;_仍有未知等待探索的博客-CSDN博客 个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 …

AGI 黑客松收官,Zilliz 向量数据库助力34支参赛队伍角逐大模型时代的Killer App

紧张的 72 小时、34 组 AGI 前沿玩家、天马行空的创意、一场酣畅淋漓的黑客松比赛&#xff01; 近期&#xff0c;由 Zilliz、Founder Park、智谱 AI 联合主办的 AGI Playground Hackathon 在北京圆满落幕。作为此次大赛的主办方之一&#xff0c;Zilliz 为选手提供了开箱即用的向…

Tuxera NTFS2024Mac电脑磁盘读写工具

NTFS是一种广泛用于Windows系统的文件系统&#xff0c;但是如果你想在Mac系统中读写NTFS格式的硬盘或U盘&#xff0c;你会发现Mac系统并不支持NTFS读写。这时&#xff0c;NTFS for Mac就变得非常有用了。本文将介绍NTFS for Mac有什么用&#xff0c;NTFS for Mac怎么用。 一、…

Java8实战-总结42

Java8实战-总结42 用Optional取代null应用 Optional 的几种模式默认行为及解引用 Optional 对象两个 Optional 对象的组合使用 filter 剔除特定的值 用Optional取代null 应用 Optional 的几种模式 默认行为及解引用 Optional 对象 采用orElse方法读取这个变量的值&#xff0…

接口自动化测试持续集成,Soapui接口功能测试参数化

按照自动化测试分层实现的原理&#xff0c;每一层的脚本实现都要进行参数化&#xff0c;自动化的目标就是要实现脚本代码与测试数据分离。当测试数据进行调整的时候不会对脚本的实现带来震荡&#xff0c;从而提高脚本的稳定性与灵活度&#xff0c;降低脚本的维护成本。Soapui最…

手撕Vue-编译指令数据

经过上一篇的分析&#xff0c;完成了查找指令和模板的功能&#xff0c;接下来就是编译指令的数据了。 所以本章节主要处理的方法则是 buildElement 方法&#xff0c;我们先分析一下我们所拿到的数据在进行编码&#xff0c;这样会更加清晰一些。 我将 name, value 打印出来&…

常规动态网页爬取

1.抓取动态网页“http://www.ptpress.com.cn”内容&#xff0c;将新书推荐中生活板块的书籍书名、价格和作者爬取并保存。 import requests import json import openpyxlurl https://www.ptpress.com.cn/recommendBook/getRecommendBookListForPortal?bookTagIdd5cbb56d-09ef…

Linux友人帐之Emacs文本编译器

一、概述 Emacs是一款功能强大、可定制、可扩展的文本编辑器&#xff0c;可以用于各种用途&#xff0c;如编程、文档处理和配置文件编辑。 安装 sudo yum install emacs 二、基础入门 2.1emacs基本文件操作 emacs -nw命令 emacs -nw命令是在终端中以无界面&#xff08;非图…

CANoe.Diva配置模板的使用

文章目录 前言一、CDD导入二、保存配置三、使用配置模板 前言 DiVa 是一种 CANoe 选项&#xff0c;用于对 ECU 中的诊断软件实施进行自动化测试。 可以通过CDD文件自动生成测试用例&#xff0c; CANoe 自动执行这些测试用例并生成结论性测试报告。 一、CDD导入 在新建Diva工程…

解决QT中文乱码

选中文本带有中文字符的文件&#xff0c;然后按如下点击 弹出对话框&#xff0c;选择当前操作系统的编码格式&#xff0c;选择Save with Encoding 中文字符前用u8进行标识

【知识】超详细! 论文相关知识科普大全

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] CSDN上粘贴有点问题&#xff0c;请前往原文查看&#xff0c;以便点击链接&#xff1a; 【知识】超详细! 论文相关知识科普大全 - 小锋学长生活大爆炸

C++数据结构X篇_16_二叉树的拷贝和释放(采用递归的方法)

在上篇的基础上&#xff0c;本篇介绍如何进行二叉树的拷贝和释放。从代码中可以看到采用递归方式进行的拷贝、释放操作&#xff0c;基本套路都是一样的。 文章目录 1. 二叉树的拷贝2. 二叉树的释放 1. 二叉树的拷贝 #include <iostream> using namespace std;//定义二叉…

美国经济危机历史与展望

目录 美国一战靠做两边的军火生意快速成长 门罗主义 咆哮的二十年 经济繁荣发展 经济大衰退前期 当时美国发生经济危机的时候&#xff0c;为什么很多乳制品加工商宁愿把牛奶导入河中&#xff0c;也不卖&#xff0c;为了保持商品的价值&#xff0c;为什么不能贱卖呢&#xf…

Linux性能优化--性能追踪2:延迟敏感的应用程序

11.0 概述 本章包含了一个例子&#xff1a;如何用Linux性能工具在延迟敏感的应用程序中寻找并修复性能问题。 阅读本章后&#xff0c;你将能够&#xff1a; 在延迟敏感的应用程序中用ltrace和oprofile弄清楚哪里产生了延迟。对“热点”函数的每个调用&#xff0c;用gdb生成栈…