题目:
bfs思路:
感觉bfs还是很容易想到的,首先定义一个双端队列(队列也是可以的~),如果值为2,则入队列,我这里将队列中的元素定义为pair<int,int>。第一个int记录在数组中的位置,即将二维数组映射到一维数组。没明白的小伙伴可以先看看力扣hot---岛屿数量-CSDN博客。第二个int记录这个橘子第几分钟被感染。最后取最大的分钟就可以啦!(还要检查一下是否有没感染到的橘子,在橘子入队列的时候,记得将grid[x][y]改为2就可以记录橘子被感染了)
代码:
C++:
class Solution {
public:
int p_x[4]={-1,1,0,0};
int p_y[4]={0,0,-1,1};
int orangesRotting(vector<vector<int>>& grid) {
deque<pair<int,int>> q;
int m=grid.size();
int n=grid[0].size();
int cnt=0;
int res=0;
//初始化q
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==2){
q.push_back({i*n+j,cnt}); //把数组转换成1维,并且记录第几分钟
}
}
}
//开始腐烂
while(!q.empty()){
//pop
auto temp=q.front();
q.pop_front();
//腐烂四周
int tempx=temp.first/n;
int tempy=temp.first%n;
int tempcnt=temp.second;
//if(grid[tempx][tempy]==2){continue;}
for(int k=0;k<4;k++){
int x=tempx+p_x[k];
int y=tempy+p_y[k];
if(x>=0 && x<m && y>=0 && y<n){
if(grid[x][y]==0||grid[x][y]==2){continue;}
grid[x][y]=2;
q.push_back({x*n+y,tempcnt+1});
cnt=max(cnt,tempcnt+1);
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==1){
return -1;
}
}
}
return cnt;
}
};
Python代码就不附啦,因为和今天发布的力扣---接雨水---单调队列-CSDN博客Python代码很像哦