回溯3-----BFS(一石激起千层浪)

news2024/11/26 12:33:27

文章目录

    • 广度优先搜索
    • 力扣429-----N叉树的层序遍历
    • 力扣994-----腐烂的橘子
    • 力扣127 -------单词接龙
    • 力扣725------打开转盘锁

广度优先搜索

需要借助 队列 来解决问题
例如二叉树的层序遍历 :
1, 将根节点入队
2, 队列出队的时候, 将该节点的左右子树节点入队, 然后循环操作。 这就是广度优先搜索。

力扣429-----N叉树的层序遍历

力扣429
在这里插入图片描述

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root)
    {
        if (root == nullptr)
            return vector<vector<int>>();

        vector<vector<int>> vv;
        queue<Node*> q;
        q.push(root);

        while (!q.empty())
        {
            vector<int> v;
            int sz = q.size();
            while (sz--)
            {
                Node* node = q.front();
                q.pop();

                v.push_back(node->val);
                for (auto e : node->children)
                {
                    q.push(e);
                }
            }

            vv.push_back(v);
        }

        return vv;
    }
};

力扣994-----腐烂的橘子

力扣题994
1,解题思路 : BFS。
2,把第一次腐烂的橘子入队,(注意:这一次腐烂的橘子不计次数, 所以step不用计步数),然后取出每一个橘子,
向四周渲染(腐烂), 如果四周是好的橘子,就要将该位置的橘子改为2, 然后加入队列中。
然后循环上述的步骤就可以
在这里插入图片描述

int arr[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) 
    {
        //1,找到一个腐烂的橘子
        queue<pair<int,int>> q;
        bool flag = false;
        for(int i = 0; i < grid.size(); i++)
        {
            for(int j = 0; j < grid[0].size(); j++)
            {
                if(grid[i][j] == 2)
                {
                     q.push({i, j});
                }

                if(grid[i][j] == 1)
                {
                    flag = true;
                }
            }
        }

        if(flag == false)
                return 0;
        
        int step = 0;
        while(!q.empty())
        {
            int sz = q.size();
            while(sz--)
            {
               auto front = q.front();
               q.pop();

               for(int i = 0; i < 4; i++)
               {
                   int newx = arr[i][0] + front.first;
                   int newy = arr[i][1] + front.second;
                   
                   if(newx < 0 || newx >= grid.size()
                   || newy < 0 || newy >= grid[0].size())
                         continue;
                   
                   if(grid[newx][newy] == 1)
                   {
                       grid[newx][newy] = 2;
                       q.push({newx, newy});
                   }
               }  
            }
            step++;
        }
        
         for(int i = 0; i < grid.size(); i++)
        {
            for(int j = 0; j < grid[0].size(); j++)
            {
                if(grid[i][j] == 1)
                {
                     return -1;
                }
            }
        }


        return step - 1;
    }
};

力扣127 -------单词接龙

力扣127
首先,将beginword入队。
然后 将beginword转换后的全部字符
判断是不是在字典wordlist中,如果在就可以入队,
但是wordlist中的字符串只能用一次, 否则会无脑循环。

然后将一次性入队字符串再进行上次的循环操作就可以
在这里插入图片描述

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) 
    {
         unordered_map<string, bool> m; //标识字符串是否用过了
         for(auto& e : wordList)
            m[e] = true;
        
         if(m.find(endWord) == m.end())
                return 0;
         
         int step = 0;
         queue<string> q;
         q.push(beginWord);

         while(!q.empty())
         {
             int sz = q.size();
             step++;
             while(sz--)
             {
                 string str = q.front();
                 q.pop();
                 
                 if(str == endWord)
                      return step;

                 for(int i = 0; i < str.size(); i++)
                 {
                       string s = str;
                       for(char ch = 'a'; ch <= 'z'; ch++)
                       {
                           s[i] = ch;

                           if(m[s] == true)
                           {
                               q.push(s);
                               m[s] = false;
                           }
                       }
                 }
             }
         }
         
         return 0;
    }
};

类似的题目:
力扣433

class Solution {
public:
    int minMutation(string startGene, string endGene, vector<string>& bank) 
    {
        unordered_map<string, bool> m;
        for(auto& e : bank)
              m[e] = true;

        if(m.find(endGene) == m.end())
            return -1;

        int step = 0;
        queue<string> q;
        q.push(startGene);
        string gene = "ACGT";

        while(!q.empty())
        {
            int sz = q.size();
            step++;
            while(sz--)
            {
                string str = q.front();
                q.pop();
                
                if(str == endGene)
                    return step - 1;

                for(int i = 0; i < str.size(); i++)
                {
                    string s = str;
                    for(int j = 0; j < gene.size(); j++)
                    {
                        s[i] = gene[j];

                        if(m[s] == true)
                        {
                            q.push(s);
                            m[s] = false;
                        }
                    }
                }
            }
        }

        return -1;      
    }
};

力扣725------打开转盘锁

力扣725

解题思路非常清晰 : BFS
但是要用一个set 来标记这个字符串是否用过, 用过了就不能用了。

循环:
1, 取出队列中的一个元素。
2, 将每个元素的旋转的所有可能性全部入队 (不能出现在死亡数字里面)

在这里插入图片描述

class Solution {
public:
    int openLock(vector<string>& deadends, string target) 
    {
       unordered_map<string, bool> m;
       set<string> _set;

       for(auto& e : deadends)
           m[e] = true;
       
       if(m["0000"] == true || m[target] == true)
            return -1;

       queue<string> q;
       q.push("0000");
       int step = 0;
       
       while(!q.empty())
       {
           int sz = q.size();
           step++;
     
           while(sz--)
           {
               string str = q.front();
               q.pop();
                
               if(str == target)
                   return step - 1;

               for(int i = 0; i < 4; i++)
               {
                   string s1 = str;
                   if(s1[i] == '9')
                          s1[i] = '0';
                   else
                      s1[i]++;
                   
                   string s2 = str;
                   if(s2[i] == '0')
                        s2[i] = '9';
                   else
                      s2[i]--;

                   if(m[s1] != true && _set.find(s1) == _set.end())
                   {
                      q.push(s1);
                      _set.insert(s1);
                   }

                   if(m[s2] != true && _set.find(s2) == _set.end())
                   {
                      q.push(s2);
                      _set.insert(s2);
                   }
               }
           }
       }
       
       return -1;
    }
};

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

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

相关文章

第一章 OAuth2.0规范(史上最详细解释)——介绍

目录 一、简介 二、角色 二、协议流程 三、授权许可 1、授权码 2、隐式许可 3、资源所有者密码凭据 4、客户端凭据 四、访问令牌 五、刷新令牌 六、TLS版本 七、HTTP重定向 八、互操作性 九、符号约定 一、简介 在传统的客户端-服务器身份验证模式中&#xff0c;客…

docker搭建redis三种集群模式

文章目录一、主从复制1、新建修改配置文件2、执行命令启动redis3、启动客户端测试二、哨兵模式Sentinel1、修改配置文件2、启动sentinel进程3、测试三、集群模式Cluster1、搭建集群1.1、创建集群挂载文件1.2、修改配置文件1.3、docker启动先六个redis实例1.4、构建集群1.5、查看…

【Canvas系列】基础入门(一)

&#x1f4da; Canvas基础入门 &#x1f525; 收藏关注随时温习 &#x1f4bb; 在线地址方便浏览 在线学习/演示地址 Canvas API 提供了一个通过JavaScript 和 HTML的元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面 —— MDN 一…

shell-条件

条件可以用test或【命令 符号和被检查的条件之间要留有空格 &#xff1a; if [ -f filename *** ] if 和then用于同一行 if [ ]; then 字符串比较&#xff1a; if [ string1 string2 ] 两个字符串相等为真 if [ string1 ! string2 ] 两个字符串不相等为假 …

web自动化测试:Selenium+Python基础方法封装

推荐阅读&#xff1a; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 正文 01 目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从…

Fiddler(4):在fiddler会话栏中添加IP列,设置抓HTTPS的请求证书安装

Fiddler(4)&#xff1a;在fiddler会话栏中添加IP列 在fiddler会话栏中添加IP列 1、点击菜单栏rules——customize rules…或者在右侧响应栏中点击FiddlerScript栏&#xff1b;如下图&#xff1a; 2、ctrlf搜索“static function main” 3、在main函数里加入下面一行代码&…

Kafka极客 - 09 Kafka Java Consumer 多线程开发实例

文章目录1. Kafka Java Consumer 设计原理2. 多线程方案3. 代码实现4. 问题思考目前&#xff0c;计算机的硬件条件已经大大改善&#xff0c;即使是在普通的笔记本电脑上&#xff0c;多核都已经是标配了&#xff0c;更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序…

对称美学 华为OD真题 100

import java.util.Scanner; import java.util.*; import java.util.stream.Collectors; import java.math.BigInteger;class Main {public static void main(String[] args) {// 处理输入Scanner in new Scanner(System.in);int t in.nextInt();long[][] cases new long[t][…

Python学习笔记-模块

目录 一、模块的概念 二、自定义模块 1.创建模块 2.使用import语句导入模块 3.使用from...import 语句导入模块 4.模块搜索目录 4.1模块默认搜索目录 4.2临时添加目录 4.3增加.pth文件 4.4 在PYTHONPATH环境变量中添加 三、以主程序的形式执行 四、python中的包&am…

计算机毕业设计php_thinkphp_vue的家乡石泉网站-乡村家乡旅游信息网站

运行环境 开发语言&#xff1a;PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHP&#xff1a;vue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 目前家乡石泉市是一个有不同民族“大杂居,小聚居”的地方,所以对于发展家乡特色业还是比较有优势…

C++初阶 priority_queue(优先级队列)的使用和模拟实现

作者&#xff1a;小萌新 专栏&#xff1a;C初阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍优先级队列的使用和模拟实现 优先级队列的使用和模拟实现priority_queue的使用priority_queue的介绍priority_queue的定义priority…

Solid.js前端新秀框架 力压 web3.js 框架

SolidJS 是什么&#xff1f;SolidJS是一个声明式、高效且灵活用于构建用户界面的 JavaScript 库。 Solid 号称拥有 JSX 语法&#xff0c;类似于 React hook 的语法&#xff0c;你可以用现代化的开发方式&#xff0c;获得性能最快的代码。 框架本身只有7 KB大小&#xff0c;无需…

【在SpringBoot项目中删除相册数据--Controller层】

在AlbumController中添加处理请求的方法&#xff1a; 请求路径&#xff1a;/album/delete请求方式&#xff1a;POST请求参数&#xff1a;Long id响应结果&#xff1a;JsonResult >>> state:20000 具体代码为&#xff1a; // http://localhost:9080/album/delete ApiO…

常用Assignment写作句型怎么积累?

Assignment是留学生在国外留学期间常见的写作内容。很多留学生在最初接触Assignment时往往会感到无从下手&#xff0c;更不知道该怎么去表达自己想要表达的内容。其实&#xff0c;Assignment写作并没有想象中那么难&#xff0c;在Assignment写作中有很多句型是经常用到的&#…

Windows win10 win11 多屏幻灯片放映壁纸 多屏设置不同的壁纸 多屏不同幻灯片壁纸

背景&#xff1a;windows 可以右键为不同的显示器设置不同的壁纸&#xff08;需要先关闭虚拟桌面&#xff09;。但是 slideshow 的不支持多个屏幕。 目前看这个问题是没有官方的方案的&#xff0c;理论上有一个收费软件可以解决&#xff0c;或者用*版&#xff0c;但是不想给钱…

React Fiber树的构建和替换过程

文章の目录前言mount 过程update 过程写在最后前言 React Fiber树的创建和替换过程运用了双缓存技术&#xff0c;即先在内存中创建 fiber 树&#xff0c;待 fiber 树创建完成以后&#xff0c;直接将旧的 fiber 树替换成新的 fiber 树&#xff0c;这样做的好处是省去了直接在页…

datax之channel学习

一般来说datax只需要我们设置reader和writer&#xff0c;但是是什么连接了reader和writer呢&#xff1f; 就是channel&#xff01; 这个有什么用&#xff1f; 慢慢学习。 core.json [devusercdp-node12 /data/DATA_DIR/share/dataingestion/conf]$ cat core.json { &quo…

应急物资仓库可视化管理系统-智慧应急物资装备管理系统

1. 项目概述 应急物资仓库可视化系统(智慧物资管理系统 DW-S300)是一套成熟系统&#xff0c;依托互 3D 技术、云计算、大数据、RFID 技术、数据库技术、AI、视频分析技术对 RFID 智能仓库进行统管理、分析的信息化、智能化、规范化的系统。 应急物资&#xff0c;是每当灾害发…

Cyanine7 NHS|CY7-N-羟基琥珀酰亚胺|CY7-NHS ester

Cyanine7 NHS|CY7-N-羟基琥珀酰亚胺|CY7-NHS ester 中文名称&#xff1a;CY7-N-羟基琥珀酰亚胺 英文名称&#xff1a;Cyanine7 NHS 性 状&#xff1a;深绿色粉末 分子量&#xff1a;827.94 Abs/Em Maxima&#xff1a;675/694nm 分子式&#xff1a;C41H46N3NaO10S2 溶解性…

【网站架构】项目越迭代越难、严重延期?那是没处理好变化

大家好&#xff0c;欢迎来到停止重构的频道。 本期&#xff0c;我们讨论网站系统的扩展性。 扩展性指的是网站系统应该如何更好地处理需求变化、版本迭代。 对于有几个项目经验的人来说&#xff0c;可能对这样的问题不以为然&#xff0c;毕竟devops、CI/CD、git、敏捷开发、…