用Java写出下面题目:在给定的m*n的网格中,每个格子有一个值,0代表空白,1代表新鲜的橘子,2代表腐烂的橘子。每分钟腐烂的橘子四个方向上新鲜的橘子会腐烂,返回让所有橘子腐烂的分钟数,如果不能全部腐烂返回-1
时间: 2024-03-08 18:47:47 浏览: 36
以下是Java代码实现:
```java
import java.util.*;
public class Solution {
public int orangesRotting(int[][] grid) {
int m = grid.length, n = grid[0].length;
Queue<int[]> queue = new LinkedList<>();
int freshCount = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1)
freshCount++;
else if (grid[i][j] == 2)
queue.offer(new int[]{i, j});
}
}
if (freshCount == 0) return 0;
int[][] direction = new int[][]{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int minutes = 0;
while (!queue.isEmpty()) {
int size = queue.size();
while (size-- > 0) {
int[] point = queue.poll();
for (int[] dir : direction) {
int x = point[0] + dir[0], y = point[1] + dir[1];
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1) {
grid[x][y] = 2;
freshCount--;
queue.offer(new int[]{x, y});
}
}
}
minutes++;
}
return freshCount == 0 ? minutes - 1 : -1;
}
}
```
其中,我们使用了一个队列来存储已经腐烂的橘子的位置,并且使用 `freshCount` 变量记录新鲜橘子的数量。每次从队列中取出一个位置,向四个方向扩散,并将新鲜的橘子变成腐烂的橘子,同时将这些位置加入队列中。直到队列为空时,所有橘子都已经腐烂。最后判断新鲜橘子的数量是否为0,如果不是则返回-1,否则返回腐烂的分钟数。
阅读全文