Leetcode994. 腐烂的橘子-----多源广度优先搜索

题目表述

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

  • 值 0 代表空单元格;
  • 值 1 代表新鲜橘子;
  • 值 2 代表腐烂的橘子。
  • 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

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

示例:

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

多源广度优先搜索

BFS 可以看成是层序遍历。从某个结点出发,BFS 首先遍历到距离为 1 的结点,然后是距离为 2、3、4…… 的结点。因此,BFS 可以用来求最短路径问题。BFS 先搜索到的结点,一定是距离最近的结点

多源BFS就是以多个节点同时作为起点,记录每一层的节点个数,同时遍历每一层的节点。具体做法是把所有已腐烂的橘子坐标放入队列,然后逐渐腐蚀左右前后四个方向的橘子(假如存在的话),把鲜橘坐标放入队列,并把鲜橘的1改为2,即已腐烂,防止来回搜超时;直到队列空为止。

class Solution { public int orangesRotting(int[][] grid) { Deque<int[]> que = new ArrayDeque<>(); int good = 0; int bad = 0; int minute = 0; int[][] dirs = {{1,0}, {0,-1}, {0,1},{-1,0}}; for(int i = 0; i < grid.length;i++){ for(int j = 0; j < grid[0].length;j++){ if(grid[i][j] == 2) que.offer(new int[]{i,j}); if(grid[i][j] == 1) good += 1; } } while(good !=0 && !que.isEmpty()){ int size = que.size(); for(int i = 0; i < size; i++){ int[] cur = que.poll(); int curx = cur[0]; int cury = cur[1]; for(int[] dir : dirs){ int x = dir[0] + curx; int y = dir[1] + cury; if(x < 0 || y < 0 || x >= grid.length|| y>=grid[0].length) continue; if(grid[x][y] == 0 || grid[x][y] == 2) continue; if(grid[x][y] == 1){ que.offer(new int[]{x,y}); grid[x][y] = 2; good -= 1; } } } minute += 1; } return good==0 ? minute : -1; } }

__EOF__

本文作者Younger
本文链接https://www.cnblogs.com/youngerwb/p/16342970.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   YoungerWb  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示