classSolution{public:intorangesRotting(vector<vector<int>>&grid){constintm=grid.size();constintn=grid[0].size();constvector<int>dirs{0,1,0,-1,0};autoisNeighborRotten=[&](inti,intj,constvector<vector<int>>&grid){for(intk=0;k<4;++k){constintr=i+dirs[k];constintc=j+dirs[k+1];if(r<0||r==m||c<0||c==n)continue;if(grid[r][c]==2)returntrue;}returnfalse;};intans=0;while(true){vector<vector<int>>nextGrid(m,vector<int>(n));// Calculate `nextGrid` based on `grid`for(inti=0;i<m;++i)for(intj=0;j<n;++j)if(grid[i][j]==1){// Freshif(isNeighborRotten(i,j,grid))// Any of 4-directionally oranges is rottennextGrid[i][j]=2;elsenextGrid[i][j]=1;}elseif(grid[i][j]==2){// RottennextGrid[i][j]=2;// Keep rotten}if(nextGrid==grid)break;grid=nextGrid;++ans;}returnany_of(begin(grid),end(grid),[&](vector<int>&row){returnany_of(begin(row),end(row),[&](intorange){returnorange==1;});})?-1:ans;}};
classSolution{public:intorangesRotting(vector<vector<int>>&grid){constintm=grid.size();constintn=grid[0].size();constvector<int>dirs{0,1,0,-1,0};intans=0;intcountFresh=0;queue<pair<int,int>>q;for(inti=0;i<m;++i)for(intj=0;j<n;++j)if(grid[i][j]==1)++countFresh;elseif(grid[i][j]==2)q.emplace(i,j);if(countFresh==0)return0;while(!q.empty()){++ans;for(intsz=q.size();sz>0;--sz){constauto[i,j]=q.front();q.pop();for(intk=0;k<4;++k){constintx=i+dirs[k];constinty=j+dirs[k+1];if(x<0||x==m||y<0||y==n)continue;if(grid[x][y]!=1)continue;grid[x][y]=2;// Mark grid[x][y] as rottenq.emplace(x,y);// Push newly rotten orange to queue--countFresh;// Decrease the count of fresh oranges by 1}}}returncountFresh==0?ans-1:-1;}};