小明回家

本文介绍了使用BFS寻找最短路径时遇到的问题,包括如何处理障碍物,血量剩余1时的特殊情况,以及如何避免路径重复导致的错误。通过将visit数组类型转换并存储最大血量,解决了路径重复的问题,确保了答案的正确性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bfs求最短路这里就不解释了。关键是一些本题特有的判断。首先,因为0代表障碍,所以我们可以将外面memset成0,然后照样读入就行了。然后再bfs时,连同原本的障碍物一同判掉就可以了。

另外,血量也是个神奇的东西。考虑到,如果你的血量只剩1了,而此时你还没有完成任务,那么你无论再怎么走都是GAMEOVER的。所以,血量剩1时,直接就跳出就行了。

那么,如何判重呢?如果不判重,那么就可能会陷入无限的死循环……而此题又难以直接用是否到过一点判重,例如下图:

#020 #010 #010 #010 #410 #013 ##那么,唯一可以完成任务的路线是:(1,2)->(2,2)->(3,2)->(4,2)->(5,2)->(5,1)->(5,2)->(6,2)->(6,3)。

可以发现,点(5,2)是被走了两次的!所以,如果按传统方式判重就会WA。

那么,如何判重呢?我们可以引入一点贪心的思想。我们可以将visit数组从bool型转为int型,存储目前到达它的路径中,到达它时血量最多的一次的血量。因为是bfs,所以简单的证明可以知道,如果一条路径到达一个已经到达过的点,且血量还小于等于visit时,那么即使完成了任务,其步数也不会时最优的。反之,如果到达一个点,其血量值可以更大,那么这就一种可能的路径,并不是重复到达。这样,就可以既保证了答案得正确性,又保证了不会TLE

int jz[20][20]={0};//存储原地图
struct NODE//一个结点一个状态
{
int x,y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值