题解:
其实这就是一道简单模拟题,看我的代码来理解吧:
tmp:记录下临时的图,初始值就是grid
开个循环:
判断1:遍历grid,如果图中没有1,也就代表没有新鲜的了,直接返回分钟数 (放在前面是因为有可能初始状态就是没有新鲜的,直接返回0)。
判断2:遍历grid,如果发现了2,那就把上、下、左、右的四个方向都判断一遍(不越界 + 值为1),就变为2,注意这里是把tmp[i][j] = 2
。
将tmp赋值给grid,时间++。
代码:
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
vector<vector<int>> tmp;
tmp = grid;
int minite = 0;
int row = grid.size();
int col = grid[0].size();
while(1)
{
bool flag = false;// 如果没有新鲜的了,就可以返回时间了
for(int i = 0; i < row; i++)
{
for(int j = 0; j < col; j++)
{
if(grid[i][j] == 1)
{
flag = true;
}
}
}
if(!flag)
{
return minite;
}
bool flag2 = false;// 判断有无腐烂,如果遍历了一次没有腐烂的情况(2->1的情况),就代表不会腐烂了
for(int i = 0; i < row; i++)
{
for(int j = 0; j < col; j++)
{
if(grid[i][j] == 2)
{
if(i-1 >= 0 && tmp[i-1][j] == 1)// 向上
{
tmp[i-1][j] = 2; flag2 = true;
}
if(i+1 < row && tmp[i+1][j] == 1)// 向下
{
tmp[i+1][j] = 2; flag2 = true;
}
if(j-1 >= 0 && tmp[i][j-1] == 1)// 向左
{
tmp[i][j-1] = 2; flag2 = true;
}
if(j+1 < col && tmp[i][j+1] == 1)// 向右
{
tmp[i][j+1] = 2; flag2 = true;
}
}
}
}
if(!flag2)
{
return -1;
}
grid = tmp;
minite++;
}
}
};