1. 问题背景与场景解析
腐烂橘子问题源自力扣(LeetCode)平台的热门算法题库,编号为994。这是一个典型的广度优先搜索(BFS)应用场景,模拟了橘子腐烂过程的传播规律。在实际生活中,这个问题可以类比食品仓库管理、传染病防控、网络节点故障扩散等多种现实场景。
问题的核心在于:给定一个m×n的网格,每个单元格可以有以下三种状态之一:
- 0 代表空单元格
- 1 代表新鲜橘子
- 2 代表腐烂橘子
每分钟,任何与腐烂橘子相邻(4个方向)的新鲜橘子都会腐烂。我们需要计算直到没有新鲜橘子被腐烂为止所需的最小分钟数,如果不可能全部腐烂则返回-1。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法选择与思路拆解
2.1 为什么选择BFS而非DFS?
这个问题天然适合BFS算法,因为:
- 层级传播特性:每分钟的腐烂相当于BFS的一层扩展
- 最短时间需求:BFS天然保证首次访问时的路径是最短的
- 并行处理能力:同一分钟可能有多个腐烂源同时影响周围
相比之下,DFS会导致:
- 无法准确计算分钟数(可能高估)
- 需要额外的标记和比较逻辑
- 代码复杂度显著增加
2.2 多源BFS的实现关键
本题的特殊性在于可能存在多个初始腐烂源(多个值为2的格子)。传统BFS通常从单一起点开始,而这里需要:
- 初始化队列:将所有腐烂橘子坐标同时加入队列
- 层级标记:使用特殊标记(如null)区分不同分钟
- 同步扩散:每分钟所有腐烂源同时向四周扩散
python复制# 多源BFS初始化示例
queue = collections.deque()
for i in range(rows):
for j in range(cols):
if grid[i][j] == 2:
queue.append((i, j))
queue.append(None) # 分钟分隔符
3. 完整算法实现与逐行解析
3.1 基础框架搭建
python复制from collections import deque
def orangesRotting(grid):
rows, cols = len(grid), len(grid[0])
