994. 腐爛的橘子 BFS

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章