c语言 迷宫深度遍历 算法,图的遍历迷宫生成算法浅析

1.

引言  在平常的游戏中,我们常常会碰到随机生成的地图。这里我们就来看看一个简单的随机迷宫是如何生成。

2. 迷宫描述随机生成一个m *

n的迷宫,可用一个矩阵maze[m][n]来表示,如图:

a4c26d1e5885305701be709a3d33442f.png a4c26d1e5885305701be709a3d33442f.png 图1.1 图1.2

这里是两个迷宫的例子,其中“■”表示障碍物(Obstacle

block)。以图1.1迷宫为例,我们可用一个9 * 9的矩阵来表示:

1 1 1 1 1 1 1 1 1

0 0 0 0 0 0 0 0 1

1 1 1 1 1 1 1 0 1

1 0 0 0 0 0 1 0 1

1 0 1 1 1 1 1 0 1

1 0 1 0 0 0 0 0 1

1 0 1 0 1 1 1 1 1

1 0 0 0 0 0 0 0 0

1 1 1 1 1 1 1 1 1

(矩阵中1表示是障碍物,0表示可以行走)

3、迷宫生成算法

(蓝色表示可以行走,棕色表示是墙壁)

a4c26d1e5885305701be709a3d33442f.png

图3.1

如图3.1所示为迷宫的初始化情形,迷宫如果除去其迷宫的外围框架就是一个7*7的矩阵,如果要生成一个完整的迷宫,那么就要遍历完图3.1所示的每一个可以行走的点,其中遍历的点也包含了入口和出口,如果每一个点都遍历完了就会生成一棵完整的遍历树,这棵遍历树包含了入口和出口所以这颗树所描述的迷宫是有解的(即:入口到出口时连通的。)图3.2就表示图1.1迷宫遍历所得到的遍历树,树包含了入口和出口所以此迷宫有解。

a4c26d1e5885305701be709a3d33442f.png

图3.2

a4c26d1e5885305701be709a3d33442f.png

图3.3

图3.3表示的是图3.2进一步的处理后得到的最终迷宫图,就是在图3.2的基础上把遍历树上的是墙壁的元素置为可行走的元素。

3.1元素的遍历

图3.1.1描述了各个遍历点的连接关系其中1元素为起始遍历点,49元素为终点遍历点我们声明一个mazepoint类用来描述每一个遍历点xtemp表示当前点在数组中的x坐标,ytemp表示当前点在数组中的y坐标,定义为mazepoint对象的next用来链表一个点的地址last用来链表上一个地址。

a4c26d1e5885305701be709a3d33442f.png

图3.1.1

a4c26d1e5885305701be709a3d33442f.png

声明了两个mazepoint的变量head和tail用于存储迷宫的链表的头地址和尾地址由于在迷宫刚刚开始的时候初始化元素是第一个所以头尾是相同的在主函数中把head赋值给了p1,(p1是我们声明的一个临时存储的变量;p1和p2用于新的链表元素生成) a4c26d1e5885305701be709a3d33442f.png

如图3.1.2所示元素1它连接到元素3和元素15,所以它可以遍历这两个元素,假设遍历的方向是随机的,如果第一次现在向右遍历那么元素3就被遍历并把它标志为flag(flag表示已经遍历过了不容许再次遍历),所以元素1和元素3都标志位flag说明在其它元素想遍历它们的时候是不能再次被遍历了。这就有可能会遍历成一棵完整的树。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值