腐烂的橘子
作者:互联网
##描述
给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1
##解题思路:
1、BFS grid是一个二维数组,维护一个装坏橘子队列,和好橘子的sum,统计坏橘子的位置,存到点队列中。统计好橘子的个数;如果一开始就没有好橘子就返回0。一分钟刷新一次队列,队列元素四周查看一边,更新四周,然后pop掉这个元素,等这一轮刷新完事之后,新的队列元素也在此过程中更新的出来,再更新时间再更新坏橘子的队列,等好橘子都没了的时候返回所求时间ret。等到队列没有坏橘子时,跳出循环,返回-1
2、direction 四个方向
3、 for(auto & dir:direction) // 是个循环dir和direction 是一样的变量,且是其中之一。 :遍历
{}
4、 auto关键字
##代码:
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
//没有一点思路,grid是一个矩阵?
queue <pair<int,int>> que; //维护队列 存坏橘子
int m=grid.size();
int n=grid[0].size();
int fresh=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(grid[i][j]==1)
{
fresh++;
}
if(grid[i][j]==2)//腐烂橘子入队
{
que.push({i,j});
}
}
}
vector<pair<int,int>> direction={{0,1},{0,-1},{1,0},{-1,0}};
int ret=0;
if(fresh==0)
return 0;
while(!que.empty())
{
ret++;
int size=que.size();
for(int i=0;i<size;i++)
{
auto pos=que.front();
que.pop();//
for(auto & dir:direction)
{
int x=pos.first+dir.first; //此处的first,是一个数,不用括号
int y=pos.second+dir.second;
if(x>=0 && x<m && y>=0 && y<n && grid[x][y]==1)
{
fresh--;
grid[x][y]=2;
que.push({x,y});
}
}
if(fresh==0)
return ret;
}
}
return -1;
}
};
标签:int,腐烂,队列,que,grid,橘子,dir 来源: https://blog.csdn.net/Tlwhisper/article/details/104683426