跳转至

994.腐烂的橘子 (Easy)*

题目描述*

在给定的网格中,每个单元格可以有以下三个值之一:

  • 值 0 代表空单元格;
  • 值 1 代表新鲜橘子;
  • 值 2 代表腐烂的橘子。

每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。

示例*

输入:[[2,1,1],[1,1,0],[0,1,1]]

输出:4

输入:[[2,1,1],[0,1,1],[1,0,1]] 输出:-1

代码*

最简单的是用暴力,不过每次会重复遍历内部的坏结点。使用 bfs,将坏结点入队,好结点加入集合,每次将坏结点出队,将周围好结点入队,并从集合中去除,最后如果好结点集合为空,则成功全部感染。

class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        int goodCnt = 0, badCnt = 0;
        for(int i = 0; i < grid.size(); i++) {
            for(int j = 0; j < grid[0].size(); j++) {
                goodCnt += (grid[i][j] == 1);
                badCnt += (grid[i][j] == 2);
            }
        }
        if(goodCnt == 0) {
            return 0;
        }
        if(badCnt == 0) {
            return -1;
        }
        int res = 0;
        int curGood = goodCnt;
        while(curGood) {
            res++;
            for(int i = 0; i < grid.size(); i++) {
                for(int j = 0; j < grid[0].size(); j++) {
                    if(grid[i][j] == 2) {
                        if(i != 0 && grid[i - 1][j] == 1) {
                            grid[i - 1][j] = 3;
                            curGood--;
                        }
                        if(i != grid.size() - 1 && grid[i + 1][j] == 1) {
                            grid[i + 1][j] = 3;
                            curGood--;
                        }
                        if(j != 0 && grid[i][j - 1] == 1) {
                            grid[i][j - 1] = 3;
                            curGood--;
                        }
                        if(j != grid[0].size() - 1 && grid[i][j + 1] == 1) {
                            grid[i][j + 1] = 3;
                            curGood--;
                        }
                    }
                }
            }
            for(int i = 0; i < grid.size(); i++) {
                for(int j = 0; j < grid[0].size(); j++) {
                    if(grid[i][j] == 3) {
                        grid[i][j] = 2;
                    }
                }
            }
            if(curGood == goodCnt) {
                return -1;
            }
            goodCnt = curGood;
        }
        return res;
    }
};
class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        int rows = grid.size();
        if(rows == 0) {
            return 0;
        }
        int cols = grid[0].size();
        queue<pair<int, int>> rot;
        set<pair<int, int>> good;
        for(int i = 0; i < rows; i++) {
            for(int j = 0; j < cols; j++) {
                if(grid[i][j] == 1) {
                    good.insert({i, j});
                }else if(grid[i][j] == 2){
                    rot.push({i, j});
                }
            }
        }
        int res = 0;
        vector<pair<int, int>> dirs{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        while(!rot.empty()) {
            int len = rot.size();
            bool flag = false;
            for(int i = 0; i < len; i++) {
                int x = rot.front().first, y = rot.front().second;
                rot.pop();
                for(auto j : dirs) {
                    auto tmp = make_pair(x + j.first, y + j.second);
                    if(good.find(tmp) != good.end()) {
                        good.erase(tmp);
                        rot.push(tmp);
                        flag = true;
                    }
                }
            }
            res += flag;
        }
        if(!good.empty()) {
            return -1;
        }
        return res;
    }
};

最后更新: July 23, 2022