在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
- 值
0代表空单元格; - 值
1代表新鲜橘子; - 值
2代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
示例 1:

输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4
java
private static final int[][] DIRECTIONS = {{-1,0},{1,0},{0,-1},{0,1}};
/**
* 1.记录好新鲜的个数,腐烂的个数
* 2.高腐烂的个数为n,在循环里面对所有腐烂的再次进行循环,这是一分钟,这一份钟里要做的就是把腐烂周围的也都置为腐烂,把这些从新鲜转为腐烂的位置放入队列,作为外层循环的条件
* 3.只有在还有新鲜的且上次有新鲜到腐烂才进行外层循环
* @param grid
* @return
*/
public int orangesRotting(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int fresh = 0;
List<int[]> q = new ArrayList<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
// 统计新鲜水果的个数
fresh++;
} else if (grid[i][j] == 2) {
// 一开始就腐烂的水果
q.add(new int[] {i,j});
}
}
}
int ans = 0;
while (fresh > 0 && !q.isEmpty()) {
ans++;
List<int[]> temp = q;
q = new ArrayList<>();
q.clear();
for (int[] badOrange : temp) {
for (int[] direction : DIRECTIONS) {
int i = badOrange[0] + direction[0];
int j = badOrange[1] + direction[1];
if (i >=0 && i <m && j >=0 && j < n && grid[i][j] == 1) {
fresh--;
grid[i][j] = 2;
q.add(new int[]{i,j});
}
}
}
}
return fresh > 0 ? -1 : ans;
}