详解腐烂的苹果(图+代码+广度优先遍历)

news2024/10/17 15:32:26

描述

给定一个 n×m n×m  的网格,其中每个单元格中可能有三种值中的一个 0 , 1 , 2。其中 0 表示这个格子为空、1 表示这个格子有一个完好的苹果,2 表示这个格子有一个腐烂的苹果。腐烂的苹果每分钟会向上下左右四个方向的苹果传播一次病菌,并导致相邻的苹果腐烂。请问经过多少分钟,网格中不存在完好的苹果。如果有苹果永远不会腐烂则返回 -1

数据范围: 1≤n,m≤1000 1≤n,m≤1000  ,网格中的值满足 0≤val≤2 0≤val≤2 

示例1

输入:

[[2,1,1],[1,0,1],[1,1,1]]

复制返回值:

4

复制

示例2

输入:

[[2,1,0],[1,0,1],[0,0,0]]

复制返回值:

-1

思路

第一步我们先要明白,每个腐烂的苹果都会同时开始向周围腐烂

第二步,我们把所有坏的苹果放进栈,同时出栈,开始腐烂 ,也就是广度优先遍历

 第三步,我们开始记录被腐烂的苹果,即可,切记我们要把被腐烂的苹果也就是腐烂的苹果放进栈,这里你可能想为啥不把旧腐烂苹果重新放进栈去呢?那我反问你,旧腐烂的苹果周边都被腐烂了,还用重新扩散取腐烂吗

 

代码

import java.util.*;


public class Solution {
    int []dx = {0, 0, 1, -1};
    int [] dy = {1, -1, 0, 0};
    boolean [][]vis;//标记腐烂的苹果
    public int rotApple (ArrayList<ArrayList<Integer>> list) {
        int m = list.size(), n = list.get(0).size();
        vis = new boolean[m][n];
        int count = 0;
        //把腐烂的苹果放进栈
        Queue<int []>q = new LinkedList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (list.get(i).get(j) == 2)q.add(new int[] {i, j});
            }
        }
        //因为每个腐烂的苹果都是同时开始传染,所以同时出栈广度优先遍历
        while (!q.isEmpty()) {
             int sz = q.size();
            while (sz-- != 0) {
                int []t=q.poll();
                int a = t[0], b = t[1];
                for (int k = 0; k < 4; k++) {
                    int x = a + dx[k], y = b + dy[k];
                    if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] &&
                            list.get(x).get(y) == 1) {
                        //找到一个好苹果开始腐烂
                        vis[x][y] = true;
                        q.add(new int [] {x, y});
                    }
                }
            }
            count++;
        }
        //判断是否有永远不会腐烂的苹果
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (vis[i][j] == false&&list.get(i).get(j)==1)return -1;
            }
        }
        return count-1;
    }
}

 

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

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

相关文章

Elsevier旗下老牌TOP上榜On Hold名单!原因涉及“论文工厂”?

【SciencePub学术】上个月突发“On Hold”近10本期刊&#xff0c;看来科睿唯安又是闷声干大事。大家注意&#xff0c;On Hold期间&#xff0c;提交的论文是不能被检索到的&#xff0c;甚至此类期刊有可能随时被WOS目录剔除&#xff0c;所以请大家注意甄别&#xff0c;谨慎投递&…

快速理解http的get和post

在网络通信中&#xff0c;HTTP 协议扮演着非常重要的角色&#xff0c;而不同的 HTTP 方法决定了客户端与服务器之间的交互方式。 这里讲一下最常用的两种方法——GET 和 POST。 一、GET 方法 GET 方法用于从服务器获取资源。 这就像去图书馆借书——你向图书馆请求一本特定的…

Linux系统:sudo systemctl reload apache2命令作用

sudo systemctl reload apache2命令作用 sudo systemctl reload apache2 是一个用于重新加载 Apache Web服务器的命令。这个命令并不会停止然后重新启动服务&#xff0c;而是尝试重新加载配置文件&#xff0c;并对正在运行的服务进行无中断的重新加载。这通常用于在更改了Apach…

Karmada核心概念

以下内容为翻译&#xff0c;原文地址 Karmada 是什么&#xff1f; | karmada 一、Karmada核心概念 一&#xff09;什么是Karmada 1、Karmada&#xff1a;开放&#xff0c;多云&#xff0c;多集群Kubernetes业务流程 Karmada (Kubernetes Armada)是一个Kubernetes管理系统&…

省出一套黑神话,光威神武DDR5 6800 C32 32GB内存条:游戏玩家的高性能选择

在游戏的世界里&#xff0c;每一帧的流畅度都可能决定胜负&#xff0c;尤其是那些对硬件规格要求较高的游戏来说&#xff0c;PC上每一种硬件的性能表现都至关重要。对于追求极致游戏体验的玩家来说&#xff0c;一款高性能的内存条是不可或缺的。前些年很多人可能还比较关注国际…

Linux下内核空间和用户空间内存映射图详解

目录 一、简介二、内存空间定义三、内存权限四、内存空间映射图4.1 32位系统4.2 64位系统4.3 映射空间解析 五、其他相关链接1、关于linux下内存管理内容总结2、Linux内核中kzalloc分配内存时用的参数GFP_KERNEL详解3、Linux下stream内存带宽测试参数和示例详解附源码总结 一、…

K8s的储存

一 configmap 1.1 configmap的功能 configMap用于保存配置数据&#xff0c;以键值对形式存储。 configMap 资源提供了向 Pod 注入配置数据的方法。 镜像和配置文件解耦&#xff0c;以便实现镜像的可移植性和可复用性。 etcd限制了文件大小不能超过1M 1.2 configmap的使用场…

【C++】———— 日期类练习

目录 前言 时间类定义 成员函数具体实现 1.获取某年某月天数 2.构造函数 3.析构函数 4.拷贝构造 5.日期类的运算符重载 5.1赋值运算符重载 5.2 和 - - 的前置后置 5.3日期比较(> , < , > ,< , ,!) 5.4 、 、- 、- 5.5日期减日期&#xff0c;求差值…

搜维尔科技:Geomagic Touch触觉力反馈应用于医疗、工业、科研、危险环境等遥操作技术

医疗机器人遥操作&#xff1a; 在医疗领域&#xff0c;该设备可用于控制医疗机器人进行手术模拟训练。例如&#xff0c;外科医生可以通过 Geomagic Touch 设备操控机器人的末端器械&#xff0c;在虚拟环境中进行手术操作练习。医生在操作设备时能感受到机器人与虚拟组织或器官…

【可答疑】基于51单片机的自动洗手器(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

前端布局与响应式设计综合指南(三)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:前端布局与响应式设计综合指南(三) 目录 42、px/em/rem有什么区别&#xff1f;为什么通常给font-s…

JavaScript object(2)

这样的话&#xff0c;就变成只读了。

2022年华为杯数学建模竞赛D题论文和代码

PISA架构芯片资源排布研究 随着全球“芯”缺浪潮的持续发酵&#xff0c;作为“工业粮食”的芯片技术成为我国亟待突围的产业之一。PISA作为兼具良好处理速度与可编程性的交换芯片架构&#xff0c;有效缓解了传统固定功能的交换芯片研发效率低下的问题。为充分发挥芯片能力&…

2024-10-15 学习人工智能的Day7

在简单的了解完学习人工智能所需的高数、线代、概率论后&#xff0c;我们又重新开始了国庆的学习&#xff0c;因为已经有十余天没有接触python&#xff0c;所以今天的内容主要是对之前学习的python的回顾与总结&#xff0c;然后对各个部分进行了简单的实践&#xff0c;在最后学…

IPV6学习汇总

一、ICMPV6 ICMPv6&#xff08;Internet Control Message Protocol version 6&#xff09;&#xff0c;即互联网控制信息协议版本六&#xff0c;是为了与IPv6配套使用而开发的互联网控制信息协议。以下是关于ICMPv6的详细介绍&#xff1a; 一、基本功能 ICMPv6向源节点报告关…

【C#】使用Visual Studio创建Windows Forms应用程序计算对角线之和

文章目录 使用Visual Studio创建Windows Forms应用程序计算对角线之和步骤 1: 创建新的Windows Forms应用程序项目步骤 2: 设计窗体步骤 3: 编写代码步骤 4: 运行程序步骤 5: 运行结果 使用Visual Studio创建Windows Forms应用程序计算对角线之和 大家好&#xff01;今天&…

HCIP-HarmonyOS Application Developer 习题(十)

1、HarmonyOS设备A上的应用通过调用分布式任务调度的能力continuesbility&#xff0c;向设备B的应用发起跨端迁移&#xff0c;此过程属于跨端迁移中的哪个流程? A、流转准备 B、流转进行 C、流转结束 D、流转完成 答案&#xff1a;D 分析&#xff1a; 2、为了帮助用户通过全局…

大数据之hadoop(hdfs部分)

1.引入:为什么需要分布式存储? 一个服务器能存入海量数据吗?显然是不能,所以构建分布式解决了存入问题.多台服务器的协调工作也是性能的横向扩展. 总结: 1.数据量太大&#xff0c;单机存储能力有上限&#xff0c;需要靠数量来解决问题 2.数量的提升带来的是网络传输、磁盘读…

标准IO:fread/fwrite

使用fread和fwrite完成两个文件的拷贝&#xff0c;要求源文件和目标文件由外界输入 #include <myhead.h> int main(int argc, const char *argv[]) {//判断是否有3个文件传入if(3 ! argc){fputs("input file error\n",stderr);return -1;}//打开源文件FILE * …

高可用之限流 08-leaky bucket漏桶算法

限流系列 开源组件 rate-limit: 限流 高可用之限流-01-入门介绍 高可用之限流-02-如何设计限流框架 高可用之限流-03-Semaphore 信号量做限流 高可用之限流-04-fixed window 固定窗口 高可用之限流-05-slide window 滑动窗口 高可用之限流-06-slide window 滑动窗口 sen…