在给定的网格中,每个单元格可以有以下三个值之一:
- 值
0
代表空单元格; - 值
1
代表新鲜橘子; - 值
2
代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1
。
示例 1:
输入:[[2,1,1],[1,1,0],[0,1,1]] 输出:4
示例 2:
输入:[[2,1,1],[0,1,1],[1,0,1]] 输出:-1 解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:
输入:[[0,2]] 输出:0 解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
思路:一道bfs模板题,记录每个橘子的时间,最大的即为答案
class Solution {
public:
struct Node{
int x,y;
int time; //记录时间
};
int g[11][11];
int X[4] = {0,0,-1,1};
int Y[4] = {-1,1,0,0};
bool inq[11][11] = {false};
int orangesRotting(vector<vector<int>>& grid) {
int res = 0;
int n = grid.size();
int m = grid[0].size();
queue<Node> q;
Node bad;
//把初始的坏橘子全部加入队列
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
if(grid[i][j]==2){
bad.x = i;
bad.y = j;
bad.time = 0;
q.push(bad);
inq[i][j] = true;
}
}
}
while(!q.empty()){
Node now = q.front();
q.pop();
//每个橘子都有一个时间属性,找到最大值即为题目要求的最小分钟数
if(res<now.time)res = now.time;
for(int i = 0;i<4;i++){
int x = now.x+X[i];
int y = now.y+Y[i];
if(x>=0&&x<n&&y>=0&&y<m&&inq[x][y]==false&&grid[x][y]==1){
Node newnode;
newnode.x = x;
newnode.y = y;
newnode.time = now.time+1; //新鲜橘子变坏需要加一分钟
q.push(newnode);
inq[x][y] = true;
grid[x][y] = 2;
}
}
}
//如果还有新鲜橘子则返回-1
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
if(grid[i][j]==1)return -1;
}
}
return res;
}
};