迷宫问题是计算机算法中的经典问题。迷宫问题自然包括求解迷宫(寻路)和生成迷宫两方面。然而数据结构的教科书中直提到了求解迷宫的最一般的算法。而对如何生成迷宫只字未提。为了验证寻路算法的正确性,一定要先生成一个迷宫才行。 从迷宫的入口进入后向前走就会不断遇到岔路。如果我们限定一下这是一座简单迷宫也就是说没有回路的迷宫,那么这座迷宫的所有路径就可以构成一棵以入口为根的树,其上的节点就是迷宫中的一个单位(小方格- -!)。出口为其中的一个节点。那么如何构造这棵树呢? 想想图的深度优先遍历的过程:在访问过第i个顶点后,继而从与此顶点相接邻的顶点中选择一个作为第i+1个要访问的顶点,而倘若与此顶点相接邻的顶点都已被访问过了,那么就退回到第i-1个顶点继续上述操作。在遍历结束之后,如果记录下了遍历的路径,以这个遍历路径作为各个顶点间新的关系的话,那么这个新的数据结构自然就是一棵树了。如此便有了生成迷宫的最概括的指导思想。 这个方法已开始就要面临的问题是如何构造这个用来遍历图,最直观的想法就是把地图上的每一个小方格都作为顶点,这也是我最初的想法,结果遍历之后发现就是一张白图---没有墙。。。 所以应该让顶点之间之间有墙,即如下图所示的方法:其中灰色表示墙,白色表示图中的顶点,红线就是顶点之间相接邻了。 也就是说初始化这张迷宫胚子的时候要做的事有: 1)把整张图都设定为墙 2)按上图的方法设置图的顶点,为了保证能到达出口和入口,要求这些顶点包含出口和入口。当然,也不一定需要真的构造一个图。心里清楚它们之间的关联就可以了。 3)把顶点所在的格设定为通路。 然后是遍历过程。深度优先遍历时为了保证迷宫道路的随机性,在选择第i+1个节点时要在与第i个节点接邻的所有顶点中随即选择。 那么接着就是遍历过程中访问顶点都需要做什么。上面说了,遍历的过程中只要只要纪录下遍历的路径就可以大功告成。那么我们就可以在上面那个图上记录遍历的路径。在访问第i个节点时就把第i个节点和第i-1个节点之间的墙设置为通路。那么等遍历结束,这张图就是一幅很漂亮的迷宫了。当然,是一个没有回路的简单迷宫了。
|