三大迷宫生成算法 (Maze generation algorithm) -- 深度优先,随机Prim,递归分割

之前同学参加面试,面试官问到迷宫生成算法,这个问题自己想了下也没有好办法,所以就查询了相关资料。这里进行了相关整理:

本文主要讲解的迷宫生成算法有三种:

1.Recursive backtracker ( 递归回溯,也是深度优先算法)

2.Randomized Prim's algorithm(随机Prim算法,让我想起了最小生成树的Prim算法)

3.Recursive division (递归分割算法)

首先,为了方便后续处理,默认的迷宫元素表示为[x,y,w]

1.我们的迷宫为常规的矩形,因此可以用二维表示一个迷宫单元, 每个迷宫单元表示为一个二维数组元素[x,y]。

3.每个迷宫单元包含左上右下四个属性, 用w表示,分别表示迷宫单元四个面的墙,墙不占据迷宫单元

下面,我们一一介绍这三种算法:


首先是深度优先(递归回溯)算法,这个算法可以表示为(根据维基百科):

1.Make the initial cell the current cell and mark it as visited
2.While there are unvisited cells
	1.If the current cell has any neighbours which have not been visited
		1.Choose randomly one of the unvisited neighbours
		2.Push the current cell to the stack
		3.Remove the wall between the current cell and the chosen cell
		4.Make the chosen cell the current cell and mark it as visited
	2.Else if stack is not empty
		1.Pop a cell from the stack
		2.Make it the current cell
如果翻译一下,就是:

1.将起点作为当前迷宫单元并标记为已访问
2.当还存在未标记的迷宫单元,进行循环
	1.如果当前迷宫单元有未被访问过的的相邻的迷宫单元
		1.随机选择一个未访问的相邻迷宫单元
		2.将当前迷宫单元入栈
		3.移除当前迷宫单元与相邻迷宫单元的墙
		4.标记相邻迷宫单元并用它作为当前迷宫单元
	2.如果当前迷宫单元不存在未访问的相邻迷宫单元,并且栈不空
		1.栈顶的迷宫单元出栈
		2.令其成为当前迷宫单元


深度优先构建迷宫的思想就是,每次把新找到的未访问迷宫单元作为优先,寻找其相邻的未访问过的迷宫单元,直到所有的单元都被访问到。通俗的说,就是从起点开始随机走,走不通了就返回上一步,从下一个能走的地方再开始随机走。一般来说,深度优先法生成的迷宫极度扭曲,有着一条明显的主路。我们使用python语言+matplotlib生成的20*30的迷宫如图所示:


我们参考维基百科,使用python语言,深度优先迷宫算法如下,代码中都已经加了注释,需要注意的是生成迷宫的算法我们将每个迷宫单元又分成了10*10的着色单元,迷宫单元为8的单位,作色为白色,墙宽2个单元,着色为黑色:

# Code by jollysoul

import random
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.cm as cm

num_rows = int(input("Rows: ")) # number of rows
num_cols = int(input("Columns: "))
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值