解题思路
判断最小时间,而且是二维矩阵,所以很容易想到用BFS。先记录一遍整个数组中有多少个新鲜橘子,当橘子都腐烂了或者某次BFS遍历时没有减少新鲜橘子的数量,遍历该结束了。最后判断一下是否还存在新鲜橘子,如果存在说明无法让所有橘子腐烂。
注意点
扩展腐烂橘子时,需要判断当前位置是否为新鲜橘子,如果是空白位置,则不能减少新鲜橘子的数量。
class Solution {
public:
int orangesRotting(vector<vector<int>>& grid) {
//BFS的题
int m = grid.size();
if(!m) return 0;
int n = grid[0].size();
queue<pair<int, int>> q;
int cnt=0;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(grid[i][j] == 1) cnt++;
else if(grid[i][j] == 2) q.push({i, j});
}
}
//四个方向
int dx[4]={1,-1,0,0}, dy[4]={0,0,1,-1};
int pre = 0, res = 0;
while(cnt > 0){
pre = cnt;
int len = q.size();
for(int i = 0; i < len; i++){
auto t = q.front();
q.pop();
for(int j = 0; j < 4; j++){
int a = dx[j]+t.first, b = dy[j]+t.second;
if(a >=0 && a < m && b >= 0 && b <n && grid[a][b]==1) q.push({a, b}), cnt--,grid[a][b] = 2;
}
}
if(pre == cnt) break;
res++;
}
if(cnt) return -1;
return res;
}
};