最近听闻数据结构与算法实践课的老师又出了和上年一样的选题,不禁想起了去年自己完成作业时的点点滴滴,遗憾当时没有写博客的习惯,之前的一些心得这一年实践的过去也逐渐淡忘了,突然就有了总结一下的想法,希望能有新的收获吧。
由于当时也没注意保存,软件完成过程中的一些文档早已丢失了,幸运的是Winform版源码还在,Unity3D版程序也还幸存,虽然由于时间紧张只完成了大概框架,但美观程度也远非Winform可以相比的,先上几张软件图吧:
生成算法
软件实现了普利姆算法、递归回溯算法、递归分割算法和深度遍历图算法四种算法来完成迷宫的生成,前两种算法生成的迷宫本质上是一个二维矩阵网络形式的生成树,也就是说其中没有回路,同时从左下角的起点到迷宫中的每一点都有且仅有一条路径,递归分割法虽然不是生成树算法但是同样属于没有回路的迷宫生成算法,深度遍历图算法则来源于知网上的一篇论文,属于图的深度遍历算法,生成的迷宫随机性更强,路径也不止一条,但不得不说的确扮相比较差。
普利姆算法迷宫(Prim)
递归分割算法(Recursive division)
递归回溯(Recursive backtracker)
深度遍历图(Deep traversal graph)
寻路算法
至于寻路算法,软件实现了深度优先遍历、广度优先遍历、和A-Star三种算法,前两种自不必说,A-Star算法是一种启发式搜索算法,移动时会评估向周围八个方向行走的预期代价,实时选出更小代价的移动方向,不过因为生成的迷宫均为正方形迷宫且起点和终点固定为左上和右下,所以在本项目中,A-Star算法并未发挥出它应有的机智,效率与广度优先基本相同。后两种算法可以寻找到最短路径,而深度优先则并不能展示。图中绿色为正确路线,蓝色为寻路过程中经过的路线。。(PS:设定为深度广度四方向移动,A-Star八方向移动)
深度优先遍历(DFS)
广度优先遍历(BFS)
A-Star
因为实例中的迷宫入口出口位置的特殊性,广度优先在寻路过程中基本要走完全称,显得有些不太机智
本文章属于综述,后面的算法会分篇分别阐述。