BFS(三)腐烂的橘子(感染问题)

news2025/1/13 14:10:43

994. 腐烂的橘子

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

            值 0 代表空单元格;
            值 1 代表新鲜橘子;
            值 2 代表腐烂的橘子。

每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。

 思路:先将刚开始的怀橘子入队列,利用这些怀橘子来带出一批新的怀橘子,

if(grid.empty())return 0;

        int row = grid.size();

        int col = grid[0].size();

        queue<Node> bad;

        for(int i = 0; i < row; i++)

            for(int j = 0; j < col; j++)

                if(grid[i][j] == 2)

                    bad.push(Node(i,j));    // 将所有怀橘子入队列

如果条件满足那么每分钟都会有怀橘子腐烂新橘子,如果有新的怀橘子加入,那么step才能加加

int step = 0;

        while(!bad.empty())

        {

            bool flag = 0;      //设置标志位,每一轮是否有橘子发生腐烂

            int size = bad.size();

            while(size--)

            {

                Node cur = bad.front();     // 对当前队列中所有坏橘子周围好橘子进行一次感染

                bad.pop();

                for(int i = 0; i < 4; i++)

                {

                    int newX = cur.x + nextP[i][0];        //对新位置元素的更新判断

                    int newY = cur.y + nextP[i][1];

                    if(newX<0||newX>=row||

                       newY<0||newY>=col)

                       continue;

                    if(grid[newX][newY]==1)

                    {

                        grid[newX][newY]=2;        

                        bad.push(Node(newX, newY));

                        flag=1;

                    }

                }

            }

            if(flag)

                step++; // 每执行一轮大循环,时间++

        }

最后BFS执行完之后,说明所有可以被腐烂的都完成了,再去遍历grid,如何还有
值为1的,说明没有办法完全腐烂,返回-1,如果没有,则返回step

        for(int i = 0; i < row; i++)    // 检测是否有橘子还是好的

            for(int j = 0; j < col; j++)

                if(grid[i][j] == 1)

                    return -1;

        return step;

源码:

int nextP[4][2] = {{0,-1},{0,1},{1,0},{-1,0}};
struct Node
{
    int x;
    int y;
    Node(int a, int b)
    {
        x = a;
        y = b;
    }
};
class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        if(grid.empty())return 0;
        int row = grid.size();
        int col = grid[0].size();
        queue<Node> bad;
        for(int i = 0; i < row; i++)
            for(int j = 0; j < col; j++)
                if(grid[i][j] == 2)
                    bad.push(Node(i,j));    // 将所有怀橘子入队列
        int step = 0;
        while(!bad.empty())
        {
            bool flag = 0;      //设置标志位,每一轮是否有橘子发生腐烂
            int size = bad.size();
            while(size--)
            {
                Node cur = bad.front();     // 对当前队列中所有坏橘子周围好橘子进行一次感染
                bad.pop();
                for(int i = 0; i < 4; i++)
                {
                    int newX = cur.x + nextP[i][0];
                    int newY = cur.y + nextP[i][1];
                    if(newX<0||newX>=row||
                       newY<0||newY>=col)
                       continue;
                    if(grid[newX][newY]==1)
                    {
                        grid[newX][newY]=2;
                        bad.push(Node(newX, newY));
                        flag=1;
                    }
                }
            }
            if(flag)
                step++; // 每执行一轮大循环,时间++
        }
        for(int i = 0; i < row; i++)    // 检测是否有橘子还是好的
            for(int j = 0; j < col; j++)
                if(grid[i][j] == 1)
                    return -1;
        return step;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rotting-oranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

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

相关文章

领导看到我自用的IDEA插件,也回去悄悄安装了...

现在哪有程序员离得开 Idea 啊&#xff01;没有 Idea 的程序员那还有灵魂吗&#xff1f;那没有&#xff01;既然我们都用 Idea&#xff0c;如何提高 Idea 的开发效率&#xff0c;在开发工具上&#xff0c;我们就卷掉其他小伙伴呢&#xff01;今天鸡翅老哥就来给大家介绍几款我一…

函数的认识

文章目录 函数是什么库函数 自定义函数 函数参数 函数调用 函数的嵌套调用和链式访问 函数的声明和定义 函数递归一、函数是什么 维基百科中对函数的定义&#xff1a;子程序在计算机科学中&#xff0c;子程序&#xff08;英语&#xff1a;Subroutine, procedure, functio…

SpringBoot+Vue项目课程作业管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

NodeJS Web 框架 Express 之路由

NodeJS Web 框架 Express 之路由参考描述路由路由匹配规则顺序匹配模块化创建使用前缀参考 项目描述哔哩哔哩黑马程序员搜索引擎Bing 描述 项目描述Edge109.0.1518.61 (正式版本) (64 位)NodeJSv18.13.0nodemon2.0.20Express4.18.2 路由 在 Web 中&#xff0c;路由可以理解为…

体验 micronaut 微服务框架

体验 micronaut 微服务框架谁在使用 MICRONAUT主要特点代码示例展示几点特性原生云原生安装 Micronaut 命令行工具创建一个 MICRONAUT 应用程序MICRONAUT是基于 JVM 的现代全栈框架&#xff0c;用于构建模块化、易于测试的微服务和无服务器应用程序。 谁在使用 MICRONAUT 主要…

数学建模——评价算法

层次分析法&#xff08;AHP&#xff09; 步骤 1.建立层次结构模型&#xff1b; 2.构造判断(成对比较)矩阵&#xff1b; 3.层次单排序及其一致性检验&#xff1b; 4.层次总排序及其一致性检验&#xff1b; 建立层次结构模型 将决策的目标、考虑的因素(决策准则)和决策对象按…

【HBase入门】5. 常用 Shell 操作(2)

前言 我们可以以shell的方式来维护和管理HBase。例如&#xff1a;执行建表语句、执行增删改查操作等等。 导入测试数据集 需求 在资料的 数据集/ ORDER_INFO.txt 中&#xff0c;有一份这样的HBase数据集&#xff0c;我们需要将这些指令放到HBase中执行&#xff0c;将数据导入…

申请Moonbeam Accelerator孵化计划申请答题指导

Moonbeam Accelerator是一个为期10 周的孵化计划&#xff0c;由Moonbeam基金会、Arrington Capital和Rokk3r共同推出&#xff0c;旨在帮助初创团队提高技术、业务、营销、金融和融资技能&#xff0c;助力您的Web3创业之梦。 申请孵化计划有任何限制吗&#xff1f;没有&#xff…

BFS(二)二叉树层序遍历(I、II)、二叉树锯齿形层序遍历、N叉树层序遍历

目录 102. 二叉树的层序遍历 107. 二叉树的层序遍历 II 103. 二叉树的锯齿形层序遍历 429. N 叉树的层序遍历 102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。…

VUE3/TS/TSX入门手册指北

VUE3入门手册vue3入门首先 查看 官方文档&#xff1a;https://cn.vuejs.org/guide/quick-start.html如果有vue2基础&#xff0c;速成课程&#xff1a;https://www.zhoulujun.co/learning-vue3/component.html&#xff08;官方文档 还是建议 翻一遍&#xff09;VUE3深入首先看源…

STM32+python产生三角波

目录任务目标实现方法python制作数表由于项目需要&#xff0c;需要产生一个三角波&#xff0c;需要覆盖4000个点的一个数组&#xff0c;这样的数组点数太多了&#xff0c;肯定不能自己一个一个手写了。最简单的一个方法是在嵌入式程序中用C写一个函数&#xff0c;对一个数组&am…

基于蜣螂优化的Elman神经网络数据预测-附代码

基于蜣螂算法优化的Elman神经网络数据预测 - 附代码 文章目录基于蜣螂算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立4.基于蜣螂优化的Elman网络5.测试结果6.参考文献7.Matlab代码摘要&#xff1a;针对…

LwIP系列--内存管理(内存池)详解

一、目的在《LwIP系列--内存管理&#xff08;堆内存&#xff09;详解》中我们详细介绍了LwIP中内存堆的实现原理&#xff0c;本篇我们介绍LwIP中内存池的实现细节。在LwIP源码中为了满足特定内存分配的需要以及优化内存占用制定了各种尺寸大小的内存池&#xff08;每种内存池管…

Golang应用执行Shell命令实战教程

本文学习如何在Golang程序中执行Shell命令&#xff08;如&#xff0c;ls&#xff0c;mkdir或grep&#xff09;&#xff0c;如何通过stdin和stdout传入I/O给正在运行的命令&#xff0c;同时管理长时间运行的命令。为了更好的理解&#xff0c;针对不同场景由浅入深提供几个示例进…

77、TensoRF: Tensorial Radiance Fields

简介 主页&#xff1a;https://apchenstu.github.io/TensoRF/ 总体而言&#xff0c;该文章主要内容于DVGO类似 将场景的亮度场建模为4D张量&#xff0c;它表示一个具有每体素多通道特征的3D体素网格&#xff0c;中心思想是将4D场景张量分解为多个紧凑低秩张量分量&#xff0c…

06 | 要找工作了,应该如何准备?

前言 前言&#xff1a;找工作更像相亲&#xff0c;总有一款适合自己。简历就像一份广告&#xff0c;对方要什么你写什么&#xff0c;而不是你有什么。 文章目录前言一、找工作的流程二、做法1. 分析职位描述&#xff08;JD&#xff09;1&#xff09;组成2&#xff09;做法一、找…

【数据结构】7.2 线性表的查找

7.2.1 顺序查找&#xff08;线性查找&#xff09; 应用范围&#xff1a; 顺序表或线性链表表示的静态查找表。表内元素之间可以无序。 数据元素类型定义&#xff1a; 数据表可能有多个数据域的值&#xff0c;比如成绩表中有姓名、成绩、总分等。所以用结构类型来表示要存储…

背景颜色和背景图片

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <!--这行代码是告诉浏览器需要使用"utf-8"字符集打开 因为HBuilder工具是采用utf-8编码的 注意&#xff1a;并不是设置当前页面的字符集编码方式--> …

SpringMVC(十二):SpringMVC文件下载

文章目录 SpringMVC文件下载 一、下载之前的准备 二、下载的基本流程 三、下载的请求数据 1、下载的后台实现 2、下载的示例代码 SpringMVC文件下载 一、下载之前的准备 展示所有玩家信息&#xff0c;包括图片展示。 <% page contentType"text/html;charset…

Linux_常见命令

1.ls ls -l 列出隐藏文件&#xff0c;并显示10项权限,类似如同下图 在部分发行版本的linux下&#xff0c;ll等同于ls -l 首先&#xff0c;第一列为-则代表着这一列是文件&#xff0c; 第一列为d则代表这一列为目录 除了第一位&#xff0c;那么其他还有9位&#xff0c;分为3组…