腐烂橘子图问题

class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        std::queue<std::pair<int, int>> qe; // 保存烂橘子得i,j坐标
        int fresh = 0; // 记录新鲜水果数量
        for (int i=0; i<grid.size(); i++) {
            for (int j=0; j<grid[i].size(); j++) {
                if (grid[i][j]==2) qe.push({i,j});
                else if (grid[i][j] == 1) fresh++;
            }
        }
        int count = 0; // 返回次数
        // 烂橘子移动坐标,上下左右
        std::vector<std::pair<int, int>> dirts{{-1,0}, {1,0}, {0,1}, {0,-1}};
        while(!qe.empty()) {
            int size = qe.size(); // 当前队列大小
            bool flag = false;    //  标记每层是否出现橘子腐烂,腐烂了count+1
            while(size>0){
                auto pair = qe.front();
                qe.pop();

                // 对四个方向上得橘子进行判断
                for (auto direct: dirts) {
                    int i = pair.first + direct.first;
                    int j = pair.second + direct.second;
                    // 校验移动得新坐标i,j,并且移动后当前时新鲜橘子更新为烂橘子
                    if (i>=0 && i<grid.size() && j>=0 && j<grid[0].size() && grid[i][j] == 1) {
                        grid[i][j] = 2; // 更新烂橘子
                        qe.push({i,j}); // 将新烂橘子坐标添加到队列中
                        fresh--;        // 新鲜橘子数量-1
                        flag = true;    // 标记有出现向四周腐烂橘子情况
                    }
                }
                size--;
            }
            if (flag) count++; // 只有腐烂了才会次数+1,可能出现孤立腐烂橘子
        }
        return fresh ? -1 : count;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值