BFS寻找多钥匙迷宫所有路径

本文介绍了一种使用BFS(广度优先搜索)寻找含有起点、终点、障碍、路径、钥匙和门的二维迷宫所有可能路径的方法。通过BFS,路径会按步数升序排列,避免了递归带来的开销。文章探讨了点结构体的设计,包括位置、钥匙标识和前驱点信息,并提到如何处理路径链表的内存管理。虽然存在查找重复点的效率问题,但可以通过优化如使用map来解决。此外,创建迷宫地图也是一个挑战。
摘要由CSDN通过智能技术生成

前驱问题:胜利大逃亡

迷宫最优解问题用队列解决,迷宫所有路径问题因为涉及回溯就用栈解决。

前半句在理,后半句我曾经这么以为。用队列也可以找到所有路径,而且找到路径的先后是按照步数升序排列的,这一点比栈好。也就是说栈并不能保证找到的路径是按步数升序排列的,甚至有从长到短排列的趋势。另外,回溯产生的大量递归开销可能是百个点规模以上迷宫无法承受的,能用迭代就不用递归。

下面的代码是通过BFS实现对于一个有起点,终点,障碍物,路,钥匙,门迷宫的二维迷宫,其中门用大写字母表示,对应的钥匙用小写表示,寻找迷宫所有路径,并打印图像和每步坐标。

钥匙和门锁问题,26个字母只需要26,用一个int即可标识。点结构体中,除了位置和钥匙标识以外,还有上一个点的信息,路径构成一个链表,遍历链表除了可以验证是否访问过以外,可以高效找到前驱点。由于路径是一个链表,用动态申请的方式,最后需要释放内存。为了解决这个问题,所有的容器存储的都是点指针。

三维甚至四维迷宫可以从二维迷宫推广;斜着走,甚至象棋走法的都是一个套路。所以方向个数和分量大小不是问题难点,在此不讨论。

findallpath.hpp 

#include<iostream>
#include<stack>
#include<queue>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值