https://www.b2bchain.cn/6165.html
//在給定的網格中,每個單元格可以有以下三個值之一:
//
//
// 值 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 。
//
//
//
//
// 提示:
//
//
// 1 <= grid.length <= 10
// 1 <= grid[0].length <= 10
// grid[i][j] 僅爲 0、1 或 2
//
// Related Topics 廣度優先搜索
import sun.misc.Queue;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
//leetcode submit region begin(Prohibit modification and deletion)
//BFS廣度優先搜索
//隊列,逐層搜索,感染橘子
class Solution {
// dr,dc 配合使用得到 grid[r][c] 上下左右元素
int[] dr = new int[]{ 1,-1,0,0};
int[] dc = new int[]{0,0,-1,1 };
public int orangesRotting(int[][] grid) {
// 獲取二維數組的行數row 和 列數 column
int R = grid.length, C = grid[0].length;
Queue<Integer> queue = new ArrayDeque();
//存儲當前層的元素 索引 腐爛時間
Map<Integer, Integer> depth = new HashMap();
for (int r = 0; r < R; ++r)
for (int c = 0; c < C; ++c)
if (grid[r][c] == 2) {
int code = r * C + c; // 轉化爲索引唯一的一維數組
queue.add(code); //存儲腐爛橘子
depth.put(code, 0); //存儲橘子變爲腐爛時的時間,key爲橘子的一維數組下標,value爲變腐爛的時間
}
int ans = 0;
while (!queue.isEmpty()) {
int code = queue.remove();
int r = code / C, c = code % C;
for (int k = 0; k < 4; ++k) {
int nr = r + dr[k];
int nc = c + dc[k];
if (0 <= nr && nr < R && 0 <= nc && nc < C && grid[nr][nc] == 1) {
grid[nr][nc] = 2;
int ncode = nr * C + nc;
queue.add(ncode);
// 計次的關鍵 元素 grid[r][c] 的上左下右元素得腐爛時間應該一致
depth.put(ncode, depth.get(code) + 1);
ans = depth.get(ncode);
}
}
}
for(int i=0;i<R;++i)//檢查是否還有新鮮橘子
for(int j=0;j<C;++j)
if(grid[i][j]==1)
return -1;
return ans;
}
}
//leetcode submit region end(Prohibit modification and deletion)