力扣 994. 腐烂的橘子

70 阅读1分钟

🔗 leetcode.cn/problems/ro…

题目

  • 给 n * m 的网格,0 为空,1 为新鲜橘子,2 为腐烂的橘子
  • 每分钟,腐烂的橘子四周的新鲜橘子也会腐烂,需要几分钟,所有的橘子都腐烂
  • 如果无法都腐烂,返回 -1

思路

  • 多源 bfs

代码

class Solution {
public:
    vector<vector<int>> dir = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
    int orangesRotting(vector<vector<int>>& grid) {
        int n = grid.size();
        int m = grid[0].size();
        bool visit[n][m];
        queue<pair<int, int>> que;
        memset(visit, 0, sizeof visit);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == 2) {
                    que.push(make_pair(i, j));
                }
            }
        }
        int size = que.size();
        int depth = -1;
        while (!que.empty()) {
            depth++;
            size = que.size();
            while (size--) {
                auto p = que.front(); que.pop();
                for (int i = 0; i < dir.size(); i++) {
                    int x = p.first + dir[i][0];
                    int y = p.second + dir[i][1];
                    if (x < 0 || x >=n || y < 0 || y >= m) continue;
                    if (grid[x][y] == 1 && visit[x][y] == false) {
                        visit[x][y] = true;
                        que.push(make_pair(x, y));
                    }
                }
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == 1 && visit[i][j] == false) return -1;
            }
        }
        return max(depth, 0);
    }
};