LeetCode994. 腐烂的橘子(2024秋季每日一题 54)

在给定的 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 = = g r i d . l e n g t h m == grid.length m==grid.length
  • n = = g r i d [ i ] . l e n g t h n == grid[i].length n==grid[i].length
  • 1 < = m , n < = 10 1 <= m, n <= 10 1<=m,n<=10
  • g r i d [ i ] [ j ] grid[i][j] grid[i][j] 仅为 0 0 0、 1 1 1 或 2 2 2

思路:bfs(宽度优先遍历)

  • 先将烂橘子所在的坐标都加入队列,并将对应位置时间都置 0
  • 然后通过 bfs 搜索,对搜索到的位置的 4 个方向的新鲜橘子,都标记为烂橘子,然后将时间 + 1,time[a][b] = time[x][y] + 1
  • bfs 搜完之后,遍历所有位置,找到时间最大的烂橘子,如果此时还有新鲜橘子,说明是不能搜到的,返回 -1 即可
cpp 复制代码
class Solution {
public:
    int time[15][15];
    queue<pair<int, int>> q;
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
    int orangesRotting(vector<vector<int>>& grid) {
        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){
                    time[i][j] = 0;
                    q.push({i, j});
                }
            }
        
        while(q.size()){
            auto t = q.front();
            q.pop();
            for(int i = 0; i < 4; i++){
                int a = t.first + dx[i], b = t.second + dy[i];
                if(a < n && a >= 0 && b >= 0 && b < m && grid[a][b] == 1){
                    time[a][b] = time[t.first][t.second] + 1;
                    grid[a][b] = 2;
                    q.push({a, b});
                }
            }
        }
        int res = 0;
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++){
                if(grid[i][j] == 1){
                    return -1;
                }else if(grid[i][j] == 2){
                    res = max(res, time[i][j]);
                }
            }
        return res;
    }
};
相关推荐
yi.Ist4 小时前
图论——Djikstra最短路
数据结构·学习·算法·图论·好难
KarrySmile4 小时前
Day55--图论--107. 寻找存在的路径(卡码网)
图论·并查集·寻找存在的路径
KarrySmile11 小时前
Day62--图论--97. 小明逛公园(卡码网),127. 骑士的攻击(卡码网)
图论·floyd·floyd算法·弗洛伊德算法·astar算法·小明逛公园·骑士的攻击
Morriser莫1 天前
图论Day2学习心得
算法·图论
KarrySmile1 天前
Day53--图论--106. 岛屿的周长(卡码网),110. 字符串接龙(卡码网),105. 有向图的完全联通(卡码网)
深度优先·图论·广度优先·广搜·岛屿的周长·字符串接龙·有向图的完全联通
zyd09151 天前
代码随想录Day50:图论(图论理论、深度搜索理论、所有可达路径、广度搜索理论)
java·数据结构·算法·leetcode·图论
啊阿狸不会拉杆2 天前
《算法导论》第 22 章 - 基本的图算法
c++·算法·排序算法·图论·拓扑学
James. 常德 student2 天前
leetcode-hot-100 (图论)
算法·leetcode·图论
KarrySmile2 天前
Day51--图论--99. 岛屿数量(卡码网),100. 岛屿的最大面积(卡码网)
图论·深度优先搜索·广度优先搜索·深搜·广搜·岛屿数量·岛屿的最大面积
是阿建吖!2 天前
【递归、搜索与回溯算法】穷举、暴搜、深搜、回溯、剪枝
算法·bfs·剪枝