994. 腐烂的橘子:带有变量控制的矩阵中的广度优先搜索

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

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

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

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

示例 1:

输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:

输入:grid = [[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:

输入:grid = [[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

广度优先搜索解法:

新鲜的橘子变为腐烂,一定是由其上下左右任一相邻的腐烂橘子所造成的后果,即从腐烂的橘子(矩阵中值为2)的位置出发逐步前进,直到所有的橘子均腐烂或者腐烂的橘子已经没有相邻的新鲜橘子进行下一步的操作。为多源广度优先搜索问题,使用队列辅助完成。

首先仍然遍历输入矩阵,将所有腐烂橘子的位置(矩阵值为2)入队,表示广度优先搜索的各个起点,然后从每个腐烂的橘子出发,寻找其相邻的新鲜橘子(矩阵值为1)进行处理,将新鲜橘子对应的矩阵值置为 2 并将新的腐烂橘子的位置入队。

虽然同样为多元广度优先搜索,本题与 542. 01 矩阵 和 1765. 地图中的最高点 的不同在于,我们进行广度优先搜索过程中需要按照每一轮次进行(每一轮在本题中表示每一分钟),而不是每个位置进行。二者本质上进行操作的流程基本相同,但本题不要求我们返回最终矩阵的结果,而是要求返回所有橘子是否都会腐烂及其所需时间,因此按照每个轮次遍历操作(现有队列中的所有位置都进行广度优先搜索,类似二叉树层序遍历的流程)能够记录当前分钟数。

同时,考虑到不一定所有的橘子都会腐烂,需要额外使用一个计数变量表示当前还剩余的新鲜橘子数量,一旦新鲜橘子变为 0,直接退出广度优先搜索即可。最终若计数变量为 0,返回分钟数;若计数变量不为 0,表示不是所有橘子都会腐烂,返回 -1。

class Solution {
private:int directions[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
public:int orangesRotting(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();queue<pair<int, int>> q;int count = 0;for(int i = 0; i < m; i++)for(int j = 0; j < n; j++){if(grid[i][j] == 2)q.push({i, j});if(grid[i][j] == 1)count++;}int minute = 0;while(count != 0 && !q.empty()){minute++;int size = q.size();for(int i = 0; i < size; i++){auto p = q.front();q.pop();for(auto direction: directions){int x = p.first + direction[0], y = p.second + direction[1];if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1){grid[x][y] = 2;q.push({x, y});count--;}}}}return count == 0 ? minute : -1;}
};

Leetcode广度优先搜索笔记2 腐烂的橘子相关推荐

  1. 【BFS 广度优先搜索】详解感染橘子最短时间问题

    一.题目描述 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格: 值 1 代表新鲜橘子: 值 2 代表腐烂的橘子. 每分钟,腐烂的橘子 周围 4 个方向 ...

  2. leetcode 994. Rotting Oranges | 994. 腐烂的橘子(BFS)

    题目 https://leetcode.com/problems/rotting-oranges/ 题解 和 leetcode 542. 01 Matrix | 542. 01 矩阵(图解,广度优先搜 ...

  3. 【广度优先搜索】leetcode 994. 腐烂的橘子

    994. 腐烂的橘子 文章目录 题目描述 示例1: 示例2: 示例3: 提示 方法:多源广度优先搜索 解题思路 代码 复杂度分析 题目描述 在给定的 m x n 网格 grid 中,每个单元格可以有以 ...

  4. [JavaScript 刷题] 搜索 - 腐烂的橘子, leetcode 994

    [JavaScript 刷题] 搜索 - 腐烂的橘子, leetcode 994 唉--之前写过笔记总结的问题,还是又卡住了. 自挂东南枝-- 题目地址: Rotting Oranges 题目如下: ...

  5. 腐烂的橘子(广度优先搜索)(考虑同时搜索)

    题目994. 腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格: 值 1 代表新鲜橘子: 值 2 代表腐烂的橘子. 每分钟,腐烂的橘子 周围 ...

  6. C++编程-腐烂的橘子-广度优先搜索

    题目: 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格: 值 1 代表新鲜橘子: 值 2 代表腐烂的橘子. 每分钟,腐烂的橘子 周围 4 个方向上相邻 ...

  7. Leecode第九天,广度优先搜索之矩阵,腐烂的橘子

    第九天,两个广度优先搜索的算法题,先来看第一个 乍一看没有头绪,那我们先简化一下题目,假如只有一个0,那问题是不是很简单,以唯一的0作为中心做广度优先搜索,设个变量depth,每搜索一层,depth+ ...

  8. LeetCode 994. 腐烂的橘子(图的BFS)

    1. 题目 在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格: 值 1 代表新鲜橘子: 值 2 代表腐烂的橘子. 每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会 ...

  9. 单源广度优先搜索 (leetcode经典例题 C++实现)

    文章目录 01矩阵 地图分析 腐烂的橘子 深度优先搜索与广度优先搜索前情回顾: 深度搜索dfs与广度搜索bfs算法总结(c++ 例题) 本节是广度优先搜索的进阶: 01矩阵 传送门: https:// ...

最新文章

  1. poj1386(判断一个有向图是否存在欧拉回路)
  2. 诺基亚主导Windows Phone手机市场 前景仍然堪忧
  3. java——自己实现基础的线程池及带有任务数过多拒绝策略、线程池销毁、自动扩充线程数量及闲时自动回收线程等操作的改进版线程池
  4. osg-3D世界到屏幕
  5. Java5、Java6、Java7的新特性
  6. 直接在低版本IE6/7/8浏览器中使用HTML5的audio和video标签播放视频音频的办法
  7. isKindOfClass vs isMemberOfClass
  8. Java学习之数据类型的转换
  9. php 有趣的php 封装,封装PHP常用的操作类
  10. 华为鸿蒙4月推送名单,华为鸿蒙系统定档4月,首批升级名单确定,3款机型优先体验...
  11. WPS国际版添加中文包
  12. 牛津大学教授Michael Wooldridge:AI社区40+年如何看待神经网络
  13. 全国计算机技术与软件专业技术资格(水平)考试
  14. android 打印机 kernel,adb如何打印kernel输出log
  15. “软件工程”到底学什么(一)
  16. 关于SNES9X的编译
  17. C++制作加密聊天程序:这样设置一下,再也不用担心女朋友翻你手机了!
  18. Spring Cloud Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)
  19. 脚本引流的震撼效果是真的么?脚本引流的话术真的重要?
  20. Trojan.DL.VBS.Agent.r 脚本病毒 ASP解密

热门文章

  1. Excel如何在姓名与字母之间加空格
  2. android全平台编译libjpeg-turbo并基于ANativeWindow加载JPEG图片
  3. 清华梦的粉碎——转自王垠
  4. uniapp返回上一页,刷新列表
  5. 苹果CMSV10本地DPLAYER播放器自动下一集设置教程
  6. Python matplotlib绘制函数曲线
  7. 阿里云如何提供接口 生成api?
  8. 通过CC逻辑控制芯片(CC Logic)HUSB320,简单实现接口升级
  9. 运维,数据库 知识点文章集锦
  10. tensorflow:Not creating XLA devices, tf_xla_enable_xla_devices not set