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
}
}
};