994. 腐烂的橘子


994. 腐烂的橘子

来自 <https://leetcode.cn/problems/rotting-oranges/> 

class Solution {
public:
    // bfs
    int orangesRotting(vector<vector<int>>& grid) {
       
        int dx[4]={-1,0,1,0};
        int dy[4]={0,1,0,-1};
        int n=grid.size();
        int m=grid[0].size();
        int fresh=0;
        queue<pair<int,int>> q;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(grid[i][j]==1){
                    fresh++;
                }else if(grid[i][j]==2){
                    q.push({i,j});
                }
            }
        }
         int minute=0;  // 腐烂的时间
         bool flag=false;
        // 此时队列中,存储都是腐烂的橘子
        while(q.size()){
            if(flag==true){  // 每次一层,统计是否有橘子腐烂
                minute++;
            }
            int len=q.size();
            //此处使用循环,意思是把 同一时刻 加入队列所有腐烂的橘子都扩散一遍
            for(int i=0;i<len;i++){
                auto t=q.front();
                q.pop();
                for(int i=0;i<4;i++){
                    int x=t.first+dx[i];
                    int y=t.second+dy[i];
                    if(x>=0 && x<n && y>=0 && y<m && grid[x][y]==1){
                        grid[x][y]=2;
                        q.push({x,y});
                        fresh--; //统计还有多少新鲜的橘子
                        flag=true; //说明腐烂过
                    }
                }
            } 
        }
        if(fresh==0){  // 新鲜橘子的数量已经为0
            return minute;
        }else{
            return -1; // 橘子没有全部腐烂完,返回-1
        }
        
    }
    
};

posted @ 2022-10-19 09:35  努力、奋斗啊  阅读(22)  评论(0编辑  收藏  举报