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;
}
}