994. 腐烂的橘子
class Solution { int cnt; int dis[12][12]; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; public: int orangesRotting(vector<vector<int>>& grid) { queue<pair<int, int> > Q; while(!Q.empty()) Q.pop(); memset(dis, -1, sizeof dis); cnt = 0; int ans = 0; int n = grid.size(), m = grid[0].size(); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(grid[i][j] == 2) { Q.push(make_pair(i, j)); dis[i][j] = 0; } else if(grid[i][j] == 1) cnt++; } } while(!Q.empty()) { pair<int, int> P = Q.front(); Q.pop(); int x = P.first, y = P.second; for(int i = 0; i < 4; i++) { int tx = x + dx[i]; int ty = y + dy[i]; if(tx < 0 || tx >= n || ty < 0 || ty >= m || ~dis[tx][ty] || !grid[tx][ty]) continue; dis[tx][ty] = dis[x][y] + 1; Q.push(make_pair(tx, ty)); if(grid[tx][ty] == 1) { cnt--; ans = dis[tx][ty]; if(!cnt) break; } } } return cnt ? -1 : ans; } };
多源BFS,把初始时腐烂的橘子全部先加入队列。
用cnt记录当前新鲜的橘子数,每腐烂一个,cnt--,如果这个值变为0,说明都被腐烂了。
用dis记录对应橘子腐烂的时间,如果~dis[i][j为真,说明dis[i][j] != -1,不是初始化dis数组时的值,说明该点已经被访问过,所以跳过。
浙公网安备 33010602011771号