题目描述:
主要思路:
宽度优先搜索,利用队列实现。
需要注意的是放进队列的时候就需要标记,而不是取出的时候再标记。
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
int n=grid.size(),m=grid[0].size();
queue<pair<int,pair<int,int>>> q;
int num=0;
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
if(grid[i][j]==2)
q.push({0,{i,j}});
else if(grid[i][j]==1)
num+=1;
}
}
int dis[4][2]={1,0,-1,0,0,1,0,-1};
while(q.size())
{
auto now=q.front();
q.pop();
int x=now.second.first,y=now.second.second,k=now.first;
for(int i=0;i<4;++i)
{
int dx=x+dis[i][0],dy=y+dis[i][1];
if(dx>=0&&dx<n&&dy>=0&&dy<m&&grid[dx][dy]==1)
{
num-=1;
if(!num)
return k+1;
grid[dx][dy]=2;
q.push({k+1,{dx,dy}});
}
}
}
if(num==0)
return 0;
return -1;
}
};