[LeetCode] 994. Rotting Oranges 腐爛的橘子



You are given an m x n grid where each cell can have one of three values:

  • 0 representing an empty cell,
  • 1 representing a fresh orange, or
  • 2 representing a rotten orange.

Every minute, any fresh orange that is 4-directionally adjacent to a rotten orange becomes rotten.

Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1.

Example 1:

Input: grid = [[2,1,1],[1,1,0],[0,1,1]]
Output: 4

Example 2:

Input: grid = [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.

Example 3:

Input: grid = [[0,2]]
Output: 0
Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.

Constraints:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10
  • grid[i][j] is 01, or 2.

這道題說給的一個 mxn 大小的格子上有些新鮮和腐爛的橘子,每一分鍾腐爛的橘子都會傳染給其周圍四個中的新鮮橘子,使得其也變得腐爛。現在問需要多少分鍾可以使得所有的新鮮橘子都變腐爛,無法做到時返回 -1。由於這里新鮮的橘子自己不會變腐爛,只有被周圍的腐爛橘子傳染才會,所以當新鮮橘子周圍不會出現腐爛橘子的時候,那么這個新鮮橘子就不會腐爛,這才會有返回 -1 的情況。這道題就是個典型的廣度優先遍歷 Breadth First Search,並沒有什么太大的難度,先遍歷一遍整個二維數組,統計出所有新鮮橘子的個數,並把腐爛的橘子坐標放入一個隊列 queue,之后進行 while 循環,循環條件是隊列不會空,且 freshLeft 大於0,使用層序遍歷的方法,用個 for 循環在內部。每次取出隊首元素,遍歷其周圍四個位置,越界或者不是新鮮橘子都跳過,否則將新鮮橘子標記為腐爛,加入隊列中,並且 freshLeft 自減1。每層遍歷完成之后,結果 res 自增1,最后返回的時候,若還有新鮮橘子,即 freshLeft 大於0時,返回 -1,否則返回 res 即可,參見代碼如下:


class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        int res = 0, m = grid.size(), n = grid[0].size(), freshLeft = 0;
        queue<vector<int>> q;
        vector<vector<int>> dirs{{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1) ++freshLeft;
                else if (grid[i][j] == 2) q.push({i, j});
            }
        }
        while (!q.empty() && freshLeft > 0) {
            for (int i = q.size(); i > 0; --i) {
                auto cur = q.front(); q.pop();
                for (int k = 0; k < 4; ++k) {
                    int x = cur[0] + dirs[k][0], y = cur[1] + dirs[k][1];
                    if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] != 1) continue;
                    grid[x][y] = 2;
                    q.push({x, y});
                    --freshLeft;
                }
            }
            ++res;
        }
        return freshLeft > 0 ? -1 : res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/994


類似題目:

Walls and Gates


參考資料:

https://leetcode.com/problems/rotting-oranges/

https://leetcode.com/problems/rotting-oranges/discuss/238681/Java-Clean-BFS-Solution-with-comments


LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM