用图的深度遍历来生成一个迷宫

 

      迷宫问题是计算机算法中的经典问题。迷宫问题自然包括求解迷宫(寻路)和生成迷宫两方面。然而数据结构的教科书中直提到了求解迷宫的最一般的算法。而对如何生成迷宫只字未提。为了验证寻路算法的正确性,一定要先生成一个迷宫才行。

从迷宫的入口进入后向前走就会不断遇到岔路。如果我们限定一下这是一座简单迷宫也就是说没有回路的迷宫,那么这座迷宫的所有路径就可以构成一棵以入口为根的树,其上的节点就是迷宫中的一个单位(小方格- -!)。出口为其中的一个节点。那么如何构造这棵树呢?

      想想图的深度优先遍历的过程:在访问过第i个顶点后,继而从与此顶点相接邻的顶点中选择一个作为第i+1个要访问的顶点,而倘若与此顶点相接邻的顶点都已被访问过了,那么就退回到第i-1个顶点继续上述操作。在遍历结束之后,如果记录下了遍历的路径,以这个遍历路径作为各个顶点间新的关系的话,那么这个新的数据结构自然就是一棵树了。如此便有了生成迷宫的最概括的指导思想。

      这个方法已开始就要面临的问题是如何构造这个用来遍历图,最直观的想法就是把地图上的每一个小方格都作为顶点,这也是我最初的想法,结果遍历之后发现就是一张白图---没有墙。。。 所以应该让顶点之间之间有墙,即如下图所示的方法:其中灰色表示墙,白色表示图中的顶点,红线就是顶点之间相接邻了。

也就是说初始化这张迷宫胚子的时候要做的事有:

          1)把整张图都设定为墙    

          2)按上图的方法设置图的顶点,为了保证能到达出口和入口,要求这些顶点包含出口和入口。当然,也不一定需要真的构造一个图。心里清楚它们之间的关联就可以了。

          3)把顶点所在的格设定为通路。

      然后是遍历过程。深度优先遍历时为了保证迷宫道路的随机性,在选择第i+1个节点时要在与第i个节点接邻的所有顶点中随即选择。

      那么接着就是遍历过程中访问顶点都需要做什么。上面说了,遍历的过程中只要只要纪录下遍历的路径就可以大功告成。那么我们就可以在上面那个图上记录遍历的路径。在访问第i个节点时就把第i个节点和第i-1个节点之间的墙设置为通路。那么等遍历结束,这张图就是一幅很漂亮的迷宫了。当然,是一个没有回路的简单迷宫了。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值