class Solution {
public:
struct node{int x,y;};
int d[4][2]={-1,0,0,1,1,0,0,-1};
int n,m;
int isok(int nx,int ny){return nx>=0&&nx<n&&ny>=0&&ny<m;}
int orangesRotting(vector<vector<int>>& grid) {
n=grid.size(),m=grid[0].size();
queue<node>q;
int cnt=0,tot=0;//cnt是图中橘子的个数(腐烂和没腐烂的)
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(grid[i][j]==2) q.push((node){i,j}),++tot;
if(grid[i][j]) ++cnt;
}
}
//啊啊啊啊值得注意的是,当tot=cnt且cnt=0时,就是图中无任何橘子,根本不会进入bfs,所以要特判
if(!cnt) return 0;//图中没有任何橘子
int ans=0;
while(!q.empty()){
if(tot==cnt) return ans;
int sz=q.size();
for(int i=1;i<=sz;++i){
node cur=q.front();q.pop();
int x=cur.x,y=cur.y;
for(int k=0;k<4;++k){
int nx=x+d[k][0],ny=y+d[k][1];
if(isok(nx,ny)&&grid[nx][ny]==1) q.push((node){nx,ny}),grid[nx][ny]=2,++tot;
}
}
++ans;//bfs层数++
}
return -1;
}
};
leetcode 994. 腐烂的橘子(bfs模板。。)
最新推荐文章于 2024-05-13 11:28:34 发布