题目
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
- 值
0代表空单元格; - 值
1代表新鲜橘子; - 值
2代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回-1 。
思考
这道题目能不能用BFS?不可以,时间不好统计
代码
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int orangesRotting(int[][] grid) {
int rows = grid.length;
int cols = grid[0].length;
Queue<int[]> queue = new LinkedList<>();
int fresh = 0;
// 把所有初始腐烂橘子入队,统计新鲜橘子数量
for(int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
if(grid[i][j] == 2){
queue.offer(new int[]{i,j});
}else if(grid[i][j] == 1){
fresh++;
}
}
}
if(fresh == 0) return 0; //没有新鲜橘子直接返回0
int time = 0;
//上下左右四个方向
int[][] dirs = {{-1,0},{1,0},{0,-1},{0,1}};
while(!queue.isEmpty()){
int size = queue.size();
// 当前这一层:代表1分钟的感染
for(int k = 0; k < size; k++){
int[] cur = queue.poll();
int x = cur[0];
int y = cur[1];
for(int[] dir : dirs){
int nx = x + dir[0];
int ny = y + dir[1];
// 判断:在网格内,并且是新鲜橘子
if(nx >=0 && nx < rows && ny >=0 && ny < cols && grid[nx][ny]==1){
grid[nx][ny] = 2;
fresh--;
queue.offer(new int[]{nx, ny});
}
}
}
time++;
}
//还有新鲜橘子没腐烂 →-1,否则time-1
return fresh > 0 ? -1 : time -1;
}
}
