994. 腐烂的橘子(dijkstral BFS)
994. 腐烂的橘子
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
- 值
0代表空单元格; - 值
1代表新鲜橘子; - 值
2代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
示例 1:

输入:grid = [[2,1,1],[1,1,0],[0,1,1]] 输出:4
示例 2:
输入:grid = [[2,1,1],[0,1,1],[1,0,1]] 输出:-1 解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:
输入:grid = [[0,2]] 输出:0 解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
提示:
m == grid.lengthn == grid[i].length1 <= m, n <= 10grid[i][j]仅为0、1或2
1 class Solution { 2 public: 3 static constexpr int N = 10; 4 vector<vector<int>> g_direction = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; 5 bool isInArea(int row, int col, int x, int y) { 6 return (x >= 0 && x < row && y >= 0 && y < col); 7 } 8 int orangesRotting(vector<vector<int>>& grid) { 9 queue<std::pair<int,int>> q; 10 vector<vector<int>> dis(N, vector<int>(N, -1)); 11 int cnt = 0; // 新鲜橘子数量 12 int m = grid.size(); 13 int n = grid[0].size(); 14 int ans = 0; 15 for (int i = 0; i < m; i++){ 16 for (int j = 0; j < n; j++){ 17 if (grid[i][j] == 2){ 18 q.push(make_pair(i, j)); // 腐烂橘子坐标入队 19 dis[i][j] = 0; // 腐烂的橘子作为多源BFS起点 20 } 21 else if (grid[i][j] == 1) { 22 cnt++; 23 } 24 } 25 } 26 while (!q.empty()) { 27 int curX = q.front().first; 28 int curY = q.front().second; 29 q.pop(); 30 // 腐烂的橘子向周围4个方向上相邻的新鲜橘子进行扩展 31 for (int i = 0; i < 4; i++) { 32 int xNext = curX + g_direction[i][0]; 33 int yNext = curY + g_direction[i][1]; 34 /* 35 * 1、不在网格范围内跳过 36 * 2、腐烂过的跳过 37 * 3、空单元格的跳过 38 */ 39 if ((!isInArea(m, n, xNext, yNext)) || 40 ~dis[xNext][yNext] || 41 !grid[xNext][yNext]) { 42 continue; 43 } 44 dis[xNext][yNext] = dis[curX][curY] + 1; // 更新最短距离 45 q.push(make_pair(xNext, yNext)); 46 if (grid[xNext][yNext] == 1){ // 只有新鲜橘子才能腐烂 47 cnt -= 1; // 新鲜橘子数-- 48 ans = dis[xNext][yNext]; // 新鲜橘子腐烂消耗的分钟数 49 if (!cnt) { // 新鲜橘子均腐烂时跳出 50 break; 51 } 52 } 53 } 54 } 55 return cnt ? -1 : ans; 56 } 57 };
浙公网安备 33010602011771号