hot100:腐烂的橘子

多源广度优先搜索,代码很烂但是能跑

class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        vector<pair<int, int>> que;
        int fresh = 0;
        int res = 0;
        // 统计烂橘子位置和橘子数量
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 0; j < grid[0].size(); j++) {
                if (grid[i][j] == 2) {
                    que.push_back(make_pair(i, j));
                }
                if (grid[i][j] == 1) {
                    fresh++;
                }
            }
        }

        while (1) {
            if (fresh == 0)
                return res;
            int ori_fresh = fresh;

            // que中的每个橘子都向四周感染一次
            int sum = que.size();
            for (int i = 0; sum > 0; i++) {
                sum--;
                int x = que[0].first;
                int y = que[0].second;
                if (x > 0 && grid[x - 1][y] == 1) {
                    que.push_back(make_pair(x - 1, y));
                    grid[x - 1][y] = 2;
                    fresh--;
                }
                if (y > 0 && grid[x][y - 1] == 1) {
                    que.push_back(make_pair(x, y - 1));
                    grid[x][y - 1] = 2;
                    fresh--;
                }
                if (x < grid.size() - 1 && grid[x + 1][y] == 1) {
                    que.push_back(make_pair(x + 1, y));
                    grid[x + 1][y] = 2;
                    fresh--;
                }
                if (y < grid[0].size() - 1 && grid[x][y + 1] == 1) {
                    que.push_back(make_pair(x, y + 1));
                    grid[x][y + 1] = 2;
                    fresh--;
                }
                que.erase(que.begin());
            }

            // 每次循环代表一分钟,如果fresh数量不变,则说明无法感染
            res++;
            if (ori_fresh == fresh) {
                return -1;
            }
        }
    }
};
posted @ 2025-02-16 11:49  huigugu  阅读(1)  评论(0编辑  收藏  举报