題解:
其實這就是一道簡單模擬題,看我的代碼來理解吧:
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++;
}
}
};