题目要求
在给定的网格中,每个单元格可以具有以下三个值之一:
值0表示空单元格;
值1表示鲜橙;
值2表示烂橙。
每一分钟,与腐烂的橙相邻(4方向)的任何新鲜橙色都会腐烂。
返回必须经过的最小分钟数,直到没有细胞有新鲜橙色。 如果这是不可能的,请返回-1。
解题思路
本题是一道非常好的BFS扩展练习,跳出常规的树形层序遍历方法。
我们看给出的实例,实际上他也可以看成是一种层序遍历,第一层就是烂橙的起始位置,然后我们把他可能传播的四个方向加入到队列中,看成第二层,然后依次类推,实际上最后返回的就是层数。
但是由于存在一种可能,使得不会将全部的橘子变成腐烂的,所以我们要记录一下橘子个数。用来判断是否全部的橘子都被腐烂。
难点: 在判断下一层的时候,记得判断一下是否合法,超出数组的边界,以及是否已经被遍历过了。
主要代码c++
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
int ct = 0, minutes = -1;
queue<vector<int>>q;
vector<vector<int>> dir ={{-1,0}, {1,0}, {0,-1}, {0,1}};
for(int i=0;i<grid.size();i++)
{
for(int j=0;j<grid[0].size();j++)
{
# 统计有多少橘子并把坏的放入queue
if(grid[i][j]>0) ct++;
if(grid[i][j]==2) q.push({i,j});
}
}
while(!q.empty())
{
minutes++;
int size = q.size();
# 对每一层中的元素操作
for(int k=0;k<size;++k)
{
vector<int> cur=q.front();
ct--;
q.pop();
# 感染下一代,有四个方向,类似有四个孩子。
for(int i=0;i<4;++i)
{
int x=cur[0]+dir[i][0], y=cur[1]+dir[i][1];
# 判断下一代是否合法
if(x>=grid.size()||x<0||y>=grid[0].size()||y<0||grid[x][y]!=1) continue;
grid[x][y]=2;
q.push({x,y});
}
}
}
if(ct==0) return max(0,minutes);
return -1;
}
};