题目994. 腐烂的橘子
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
示例 1:
输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:
输入:grid = [[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:
输入:grid = [[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 10
grid[i][j] 仅为 0、1 或 2
思路
这道题还是采用广度优先搜索,但和平时不同的是,橘子是同时腐烂的,所以就要考虑什么时候加时间;而此时我们可以定义一个变量,来表示每一批腐烂橘子的末尾位置,当遍历到这个位置时,对时间加一即可。注意:当橘子全部腐烂时,如果不是正好一批橘子全部腐烂的时候,需要给时间加一;当一开始就没有橘子或者没有新鲜橘子时,直接返回0,当一开始没有腐烂橘子时,直接返回-1.
代码(力扣格式)
int dx[4]={1,0,0,-1};
int dy[4]={0,1,-1,0};
int orangesRotting(int** grid, int gridSize, int* gridColSize){
int x=gridSize,y=*gridColSize;
int fl[105][2];
int l=0,r=0;
int flag=0,sum=0;
int ms=0;
int f=0;
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
if(grid[i][j]){
sum++;
}
if(grid[i][j]==2){
fl[r][0]=i;
fl[r++][1]=j;
}
}
}
int f1=r;
int f2=r;
if(sum==0||r==sum){
return 0;
}
if(r==0){
return -1;
}
while(l<r){
f=0;
int mx=fl[l][0],my=fl[l++][1];
for(int i=0;i<4;i++){
int ix=mx+dx[i],iy=my+dy[i];
if(ix>=0&&ix<x&&iy>=0&&iy<y&&grid[ix][iy]==1){
flag++;
grid[ix][iy]=2;
fl[r][0]=ix,fl[r++][1]=iy;
}
}
if(l>=f2){
f=1;//f等于1表示正好是当前的腐烂橘子将周围橘子变腐烂时所有橘子腐烂
ms++;
f2=r;
}
if(flag+f1==sum){
if(f==0){
ms++;
}
return ms;
}
}
return -1;
}