多源bfs
994. 腐烂的橘子 - 力扣(LeetCode)
class Solution {int dist[21][21],vis[21][21];int dir[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
public:int orangesRotting(vector<vector<int>>& grid) {int orange=0,ans=0;queue<pair<int,int>> q;memset(dist,0,sizeof dist);memset(vis,0,sizeof vis);int m=grid.size(),n=grid[0].size();for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]==2) q.push({i,j}),vis[i][j]=1;else if(grid[i][j]==1)orange++;}}while(q.size()){auto [x,y]=q.front();q.pop();for(int i=0;i<4;i++){int xx=x+dir[i][0],yy=y+dir[i][1];if(xx<0||xx>=m||yy<0||yy>=n||vis[xx][yy]==1||!grid[xx][yy])continue;dist[xx][yy]=dist[x][y]+1;q.push({xx,yy});if(grid[xx][yy]==1){orange--;ans=dist[xx][yy];vis[xx][yy]=1;if(orange==0)break;}}}return orange?-1:ans;}
};
