多源BFS,从每个腐烂的橘子同时出发,类似层序遍历,层数就是感染时间
class Solution {
public:
vector<pair<int, int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}};
int orangesRotting(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size(), ans = -1, flag = 0;
queue<pair<int, int>> q;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(grid[i][j] == 2) q.push({i, j});
if(grid[i][j]) flag = 1;
}
}
if(flag == 0) return 0;
while(!q.empty()) {
int tmpn = q.size();
ans++;
while(tmpn--) {
auto [x, y] = q.front(); q.pop();
for(auto [dx, dy] : dir) {
int nx = x + dx, ny = y + dy;
if(nx < 0 || nx >= m || ny < 0 || ny >= n) continue;
if(grid[nx][ny] == 1) {
grid[nx][ny] = 2;
q.push({nx, ny});
}
}
}
}
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(grid[i][j] == 1) return -1;
}
}
return ans;
}
};