网易首页 > 网易号 > 正文 申请入驻

腐烂橘子问题:用多源BFS解最短时间

0
分享至

给你一个m乘n的网格,里面放着三种东西:空格子、新鲜橘子和腐烂橘子。每分钟,每个腐烂橘子会同步感染它上下左右四个方向紧邻的新鲜橘子,让它们也烂掉。现在问你:要让所有橘子都烂掉,最少需要多少分钟?如果永远不可能烂完,就返回-1。

这道题叫“腐烂的橘子”,是很多科技公司面试时的经典算法题。第一次见到它的人,多半会试着一步一步模拟腐烂的过程:每分钟扫一遍整个网格,找到所有当前已经烂掉的橘子,然后把它们相邻的新鲜橘子标记为腐烂,再进入下一分钟,如此循环,直到没有新橘子被感染为止。

这个思路很容易理解,但有一个明显的缺点:每模拟一分钟,就要把整个网格完整遍历一次。假设网格有M行N列,那么在最坏情况下,每个单元格都可能被反复扫描很多遍。具体来说,时间复杂度的上限是O((M×N)²),也就是把单元格总数再平方一次。对于稍大一点的输入,这个算法就慢得没法用了。

有没有更高效的办法?再仔细想一想腐烂的过程:一开始,网格里可能同时存在多个腐烂的橘子,它们会同时向外扩散,就好像几处火源同时往四周蔓延。如果我们一个一个地处理这些腐烂橘子,等于人为地把并行的过程改成了串行,重复计算了大量无效的步骤。更合理的做法,是把所有这些最初的腐烂橘子当作一组“种子”,在同一时刻开始,同时往外传播。这正好符合一种经典的算法模式——多源广度优先搜索,也就是多源BFS。

在传统的单源BFS中,我们先往队列里放入一个起点,然后一层一层向外扩展,每一层代表一个单位距离。如果把这个距离换成时间,那么每个节点第一次被访问到的时刻,就是从起点到它的最短用时。而多源BFS只是把起点从一个变成多个:在开始时,把所有的腐烂橘子一次性全部丢进队列,记下它们的“时间戳”为0。接下来,BFS自然就会按层级处理:第0分钟处理所有初始腐烂的橘子,第1分钟处理它们感染的第一批新鲜橘子,第2分钟处理第二批,以此类推。每一轮扩展都会把新腐烂的橘子放进队列尾部,等当前层级全部处理完毕,再统一把计时加1,这样就能完美模拟出并行的腐烂过程。

具体到这道题,整个算法可以拆成三步。第一步,遍历网格,做两件事:把所有腐烂的橘子坐标塞进队列,同时数清楚新鲜橘子一共有多少个。之所以要计数,是为了最后判断是不是所有橘子都烂掉了。如果初始时空队列或新鲜橘子数为零,那就不用算了,直接返回0。第二步,开始真正的多源BFS。在队列不为空的情况下,先记下当前队列的大小——这代表“当前这一分钟有待处理的腐烂橘子数量”。然后逐个取出这些烂橘子,检查它们的上下左右四个邻居:如果邻居在网格范围内并且还是新鲜橘子,就把它标记为腐烂,新鲜橘子计数减1,同时把这个新烂掉的坐标加入队列,等待下一分钟处理。每当成功烂掉至少一个新鲜橘子,就说明这一分钟确实发生了传播,计时器增加1。整个过程一直循环,直到队列变空,或者所有新鲜橘子都已腐烂。

第三步很简单:看看新鲜橘子计数是不是减到了零。如果是,返回计时器的值,这就是全部腐烂所需的最短分钟数;如果不是,说明有些新鲜橘子永远接触不到腐烂源,返回-1。

以原文中的例子来演示一下。假设网格长这样:第一行是2、1、1,第二行是1、1、0,第三行是0、1、1。数字2代表烂橘子,1代表好橘子,0是空格。一开始,队列里只有坐标(0,0)这一个腐烂橘子,新鲜橘子一共有6个。

第1分钟:从队列里取出(0,0),检查它的邻居。左边和上边越界,右边(0,1)是新鲜橘子,把它标记为烂橘子,新鲜数减为5,把(0,1)加入队列;下边(1,0)也是新鲜的,同样标记、计数减为4、把(1,0)入队。这一分钟成功烂掉了两个橘子,计时变成1。

第2分钟:队列里现在是(0,1)和(1,0)。先处理(0,1),它上边是越界,下边(1,1)是新鲜橘子,标记、计减、入队,新鲜数变成3。右边(0,2)是新鲜,同样操作,新鲜数变为2。接着处理(1,0),它的四个邻居里,(0,0)已经烂了,(2,0)是空格,右边(1,1)刚才已经标记过,下边越界,没有新感染。这一分钟计时加1,变成2。

第3分钟:队列里有(1,1)和(0,2)。(1,1)的四周:上(0,1)烂了,下(2,1)是新鲜橘子,标记它,新鲜数减为1,入队;左(1,0)烂了,右(1,2)是空格。(0,2)的四周只有左边烂了,其他越界。共感染一个新橘子,计时变3。

第4分钟:队列里只有(2,1)。它的邻居下边越界,左边空格,右边(2,2)是新鲜橘子,标记后新鲜数归零。计时再加1变成4,新鲜橘子数为0,循环结束。最后返回4,这就是答案。

这个算法的巧妙之处,在于它利用了BFS天然按层级遍历的特性,直接把“分钟”和“层级”一一对应起来。所有腐烂橘子在同一分钟里作用的邻居,都在BFS的同一层中被发现并标记。而一个新鲜橘子第一次被某个腐烂邻居感染的时间,恰好就是它被加入队列时所在的层数,也即最短的腐烂用时。后续即使有更晚的传播路径到达同一个橘子,我们也不会再处理,因为它在更早的分钟就已经烂掉了。

从复杂度来看,这种方法把每个单元格最多访问一次,时间上限降到O(M×N);空间上,最差情况下队列里可能同时塞满所有单元格,所以也是O(M×N)。相比于暴力模拟的平方级复杂度,提升是质的飞跃。

这道题的价值,还不仅仅在于解决腐烂橘子本身。一旦认出了“多处源头同时向外扩散、求最少时间或最短距离”的模式,你就拿到了多源BFS的钥匙。看到疫情传播、山火蔓延、网络信息扩散这类场景,只要题目中出现“多起点同步扩散”的意味,就可以直接把这个思路迁移过去:把所有初始源一次性入队,然后BFS逐层处理,每个节点的首次访问时间即为所求。

下次再碰上类似的网格感染问题,就不必逐分钟扫全局,而是直接让算法像真的传播那样,由内而外同步推进。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
国际足联宣布:马宁将担任德国vs巴拉圭1/16决赛第四官员,这将是中国裁判员首次参与世界杯淘汰赛执裁工作,周飞担任候补助理裁判

国际足联宣布:马宁将担任德国vs巴拉圭1/16决赛第四官员,这将是中国裁判员首次参与世界杯淘汰赛执裁工作,周飞担任候补助理裁判

鲁中晨报
2026-06-28 09:51:45
英媒:因凡蒂诺小组赛期间乘私人飞机27次;碳排放约为78人一年总和

英媒:因凡蒂诺小组赛期间乘私人飞机27次;碳排放约为78人一年总和

懂球帝
2026-06-29 05:45:07
700分以上,浙江断层领先!2026年全国一卷省份高分对比

700分以上,浙江断层领先!2026年全国一卷省份高分对比

史海流年号
2026-06-26 08:07:47
陕西一38岁女子接女儿放学途中,被卷入车底,群众合力抬车救人,家属回应:已不幸去世,事故正由交警调查处理

陕西一38岁女子接女儿放学途中,被卷入车底,群众合力抬车救人,家属回应:已不幸去世,事故正由交警调查处理

扬子晚报
2026-06-28 19:06:58
沉默4天后,美方报复来了,对华突然下禁令,将禁止进口中国产品

沉默4天后,美方报复来了,对华突然下禁令,将禁止进口中国产品

影孖看世界
2026-06-28 18:18:36
“这种环境都能排卵?”女毕业生表白单位男领导,评论区炸锅了

“这种环境都能排卵?”女毕业生表白单位男领导,评论区炸锅了

世界圈
2026-06-26 08:40:50
凡尔赛啊!山东一家长称孩子高考687分省排140名,哭诉清北上不了

凡尔赛啊!山东一家长称孩子高考687分省排140名,哭诉清北上不了

呼呼历史论
2026-06-29 03:12:19
李玟离世三年后,主诊医生被起诉,死因曝光,家人:终于等到正义

李玟离世三年后,主诊医生被起诉,死因曝光,家人:终于等到正义

余鴡搞笑段子
2026-06-28 17:42:46
看完阿根廷3-1约旦!不得不承认的5个事实,梅西再刷史诗级纪录!

看完阿根廷3-1约旦!不得不承认的5个事实,梅西再刷史诗级纪录!

小青年渌渌
2026-06-28 20:07:17
1夜6大转会!米兰7400万签下替补前锋 拉克鲁瓦世界杯后加盟蓝军!

1夜6大转会!米兰7400万签下替补前锋 拉克鲁瓦世界杯后加盟蓝军!

林子说事
2026-06-28 18:49:36
北京一位空姐嫁给了打工仔,婚后一年,她才得知丈夫真实身份

北京一位空姐嫁给了打工仔,婚后一年,她才得知丈夫真实身份

千秋文化
2026-06-21 19:49:55
王楚钦说孙颖莎除了打球,其他啥也不会

王楚钦说孙颖莎除了打球,其他啥也不会

最爱乒乓球
2026-06-29 00:06:20
37次射门0进球:C罗与梅西世界杯对决梦碎

37次射门0进球:C罗与梅西世界杯对决梦碎

星河漫山野
2026-06-29 01:12:04
离谱!3亿身家、14任鲜肉、5万人报名、一天28次,泰国富婆太荒诞

离谱!3亿身家、14任鲜肉、5万人报名、一天28次,泰国富婆太荒诞

阿讯说天下
2026-06-26 12:08:56
男子网购 “乖乖水”等掺入多名女性饮品中,迷昏对方后实施猥亵并拍视频传播,案发后男子家属代为赔偿受害人损失并取得谅解,男子被判5年

男子网购 “乖乖水”等掺入多名女性饮品中,迷昏对方后实施猥亵并拍视频传播,案发后男子家属代为赔偿受害人损失并取得谅解,男子被判5年

扬子晚报
2026-06-28 13:45:16
上海球迷穿日本队球衣庆祝!上海市足协:足球无国界 球迷有祖国

上海球迷穿日本队球衣庆祝!上海市足协:足球无国界 球迷有祖国

念洲
2026-06-29 06:50:42
郑钦文谈黑粉:你们黑我的时候,不怕有一天被我打脸吗?

郑钦文谈黑粉:你们黑我的时候,不怕有一天被我打脸吗?

懂球帝
2026-06-28 23:02:10
法拉利领队认了:跟不上节奏,自己把奥地利站玩崩

法拉利领队认了:跟不上节奏,自己把奥地利站玩崩

体坛观察猿
2026-06-29 00:28:53
余承东:说遥遥领先,真正做到才敢说!经过比较,华为的智能驾驶系统还是全世界最好的!网友调侃:世界已经被你注册了

余承东:说遥遥领先,真正做到才敢说!经过比较,华为的智能驾驶系统还是全世界最好的!网友调侃:世界已经被你注册了

大白聊IT
2026-06-28 12:24:23
前男友回应黄一鸣封号:她和她女儿账号是永久封禁,不能申诉 ​

前男友回应黄一鸣封号:她和她女儿账号是永久封禁,不能申诉 ​

观鱼听雨
2026-06-27 23:52:29
2026-06-29 07:55:00
固件更新中
固件更新中
有态度网友ytd
260文章数 50关注度
往期回顾 全部

科技要闻

DeepSeek最新论文:如何让大模型跑得更快

头条要闻

民办高校被指禁止小米汽车入校 校方回应

头条要闻

民办高校被指禁止小米汽车入校 校方回应

体育要闻

两周飞5万公里!因凡蒂诺遭环保人士猛批

娱乐要闻

曾沛慈拿下《乘风2026》年度总冠军

财经要闻

省钱,我只服梁文锋

汽车要闻

搭载华为乾崑六件套 东风奕派M8预售19.98万起

态度原创

旅游
艺术
家居
时尚
游戏

旅游要闻

晨读   曹伟明:古老水村

艺术要闻

林徽因先生一生珍稀之影像。

家居要闻

绿意盎然 自然之境

夏天裙子不用买多,建议入手一条蓝裙子,清爽高级又耐看

IGN揭秘《GTA6》实体版没光盘真相 搞不好大厂都学

无障碍浏览 进入关怀版