【发布时间】:2020-09-25 21:34:11
【问题描述】:
我正在处理rotten oranges problem:
在给定的网格中,每个单元格可以具有以下三个值之一:
- 值 0 表示空单元格;
- 值 1 代表新鲜的橙子;
- 代表烂橙的值 2。
每分钟,任何与(4 向)相邻的新鲜橙子 烂橘子变烂了。
返回在没有单元格之前必须经过的最小分钟数 有一个新鲜的橙子。如果这是不可能的,则返回 -1。
示例 1:
- 输入:[[1,1,1],[1,1,0],[0,1,2]]
- 输出:4
我已经实施了 BFS 解决方案。然后在完成 BFS 之后,我开始另一个迭代以确保没有新鲜的橙子剩下,因为如果有新鲜的橙子剩下,那么我必须返回 -1。
但是,我发现在最后一个循环中,只有一些值更改为 2,而其他一些值保持为 1。我不确定为什么它们也没有更改为 2。
class Solution {
public int orangesRotting(int[][] grid) {
//need adjacency list/matrix
Queue<String> q = new LinkedList<>();
int[] count = new int[1];
count[0] = 0;
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[i].length; j++) {
if(grid[i][j] == 2) {
q.add("" + i + j);
bfs(grid, i, j, count, q);
}
}
}
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[i].length; j++) {
// does NOT always print correct value: 1 is not changed to 2
System.out.println(grid[i][j]);
if(grid[i][j] == 1) {
return -1; // ... and so this -1 is returned when it shouldn't
}
}
}
return count[0];
}
private static void bfs(int[][] grid, int i, int j, int[] count, Queue<String> q) {
while(!q.isEmpty()) {
String s = q.remove();
//System.out.println(s); //prints correct indices
i = Integer.parseInt(s.substring(0,1));
j = Integer.parseInt(s.substring(1));
if(i - 1 > 0 && grid[i - 1][j] == 1) {
count[0]++;
i--;
grid[i][j] = 2;
q.add("" + i + j);
}
if(i + 1 < grid.length && grid[i + 1][j] == 1) {
count[0]++;
i++;
grid[i][j] = 2;
q.add("" + i + j);
}
if(j - 1 > 0 && grid[i][j - 1] == 1) {
count[0]++;
j--;
grid[i][j] = 2;
q.add("" + i + j);
}
if(j + 1 < grid.length && grid[i][j + 1] == 1) {
count[0]++;
j++;
grid[i][j] = 2;
q.add("" + i + j);
}
}
}
}
我的代码为上面引用的示例输出 -1,因为它仍然在最终循环中找到 1,而它不应该。
你能帮我弄清楚为什么会这样吗?
【问题讨论】:
-
否则?输入一个 if 后,可以输入第二个 if。可以介绍一个
nextI。 -
@JoopEggen 这应该会发生,因为橙色可能是你旁边的 4 个其他没有腐烂的橙色,并且在一次 bfs 迭代中它们都应该被添加到队列中
-
你能解释一下什么“烂橙子问题”到底是什么吗?
标签: java algorithm graph pass-by-reference breadth-first-search