引用
https://leetcode-cn.com/problems/rotting-oranges/
在给定的网格中,每个单元格可以有以下三个值之一:
- 值 0 代表空单元格;
- 值 1 代表新鲜橘子;
- 值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
示例 1:
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:
输入:[[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:
输入:[[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0
class Solution {
int row = 0;
int col = 0;
public int orangesRotting(int[][] grid) {
row = grid.length;
col = grid[0].length;
// 遍历 查看烂橘子的坐标;
Queue<ArrayList<Integer>> bucket = new LinkedList<ArrayList<Integer>>();
int i, j;
boolean hasFresh = false;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (grid[i][j] == 2) {
ArrayList<Integer> pos = new ArrayList<Integer>();
pos.add(i);
pos.add(j);
bucket.offer(pos);
} else if (grid[i][j] == 1) {
hasFresh = true;
}
}
}
// 没有新鲜橘子 0秒
if (!hasFresh) {
return 0;
}
// 没有变质橘子 -1
if (bucket.size() == 0) {
return -1;
}
int time = 0;
// 遍历坏橘子坐标
while (!bucket.isEmpty()) {
// 每一批坏橘子的数量
int count = bucket.size();
// System.out.println("===第 "+time+" 轮感染= count:"+count+"==");
for (int k = 0; k < count; k++) {
ArrayList<Integer> pos = bucket.poll();
int x = pos.get(0), y = pos.get(1);
// System.out.println("坏橘子坐标"+x+","+y);
// 开始污染
// 上
if (check(x, y + 1) && grid[x][y+1] == 1) {
grid[x][y+1] = 2;
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(x);
temp.add(y+1);
bucket.offer(temp);
// System.out.println("坐标点被感染: "+x+","+ (y+1));
}
// 下
if (check(x, y - 1) && grid[x][y-1] == 1) {
grid[x][y-1] = 2;
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(x);
temp.add(y-1);
bucket.offer(temp);
// System.out.println("坐标点被感染: "+x+","+ (y-1));
}
// 左
if (check(x - 1, y) && grid[x-1][y] == 1) {
grid[x-1][y] = 2;
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(x-1);
temp.add(y);
bucket.offer(temp);
// System.out.println("坐标点被感染: "+(x-1)+","+ y);
}
// 右
if (check(x + 1, y) && grid[x + 1][y] == 1) {
grid[x+1][y] = 2;
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(x+1);
temp.add(y);
bucket.offer(temp);
// System.out.println("坐标点被感染: "+(x+1)+","+ y);
}
}
time++;
}
hasFresh = false;
// 存在未感染的橘子
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (grid[i][j] == 1) {
// System.out.println("此坐标点有新鲜橘子 i:"+i+"j:"+j);
hasFresh = true;
break;
}
}
}
if (hasFresh) {
return -1;
} else {
return time-1;
}
}
private boolean check(int x, int y) {
if (x >= 0 && x < row && y >= 0 && y < col) {
return true;
}
return false;
}
}