前驱问题:胜利大逃亡
迷宫最优解问题用队列解决,迷宫所有路径问题因为涉及回溯就用栈解决。
前半句在理,后半句我曾经这么以为。用队列也可以找到所有路径,而且找到路径的先后是按照步数升序排列的,这一点比栈好。也就是说栈并不能保证找到的路径是按步数升序排列的,甚至有从长到短排列的趋势。另外,回溯产生的大量递归开销可能是百个点规模以上迷宫无法承受的,能用迭代就不用递归。
下面的代码是通过BFS实现对于一个有起点,终点,障碍物,路,钥匙,门迷宫的二维迷宫,其中门用大写字母表示,对应的钥匙用小写表示,寻找迷宫所有路径,并打印图像和每步坐标。
钥匙和门锁问题,26个字母只需要26位,用一个int即可标识。点结构体中,除了位置和钥匙标识以外,还有上一个点的信息,路径构成一个链表,遍历链表除了可以验证是否访问过以外,可以高效找到前驱点。由于路径是一个链表,用动态申请的方式,最后需要释放内存。为了解决这个问题,所有的容器存储的都是点指针。
三维甚至四维迷宫可以从二维迷宫推广;斜着走,甚至象棋走法的都是一个套路。所以方向个数和分量大小不是问题难点,在此不讨论。
findallpath.hpp
#include<iostream>
#include<stack>
#include<queue>