四种迷宫生成算法


简介

所谓迷宫生成算法,就是用以生成随机的迷宫的算法

迷宫生成算法是处于这样一个场景:

  • 一个row行,col列的网格地图,一开始默认所有网格四周的墙是封闭的
  • 要求在网格地图边缘,也就是网格的边上打通2面墙
  • 所有网格都至少保证网格周围至少有一堵墙打通
  • 所有网格都能通过打通的墙能形成一条通路

博主已实现RecursiveBacktracking(递归回溯),RecursiveSegmentation(递归分割),随机Prim算法,Kruskal+并查集四种迷宫生成算法,这篇文章主要对这四种算法进行简要的介绍

基于Unity的迷宫生成算法代码实现

Github链接

递归回溯算法

复杂度

  空间:O(n),时间:O(n),n为迷宫节点数row*col

原理

以一个栈作为辅助的数据结构,用以记录打通区域的顺序,用以回溯

一开始随机在地图中选择一个区域,加入栈。

之后在之前选择的区域周围随机选择一个未打通的区域,将新选择的区域和之前选择区域的墙打通,并把新的区域的加入栈

如果四周的区域都打通,就让栈出栈,将当期所选择的区域设置栈新的栈顶,表示回退到上一个区域

之后递归的按之前的步骤选择下一个区域直到所有区域都被打通

缺点

这种算法实现思路极为简单,但通路过于明显,甚至有可能会出现上图中的迷宫,很尴!!!

递归分割算法

复杂度

  递归空间复杂度:O(row * col),最好时间复杂度:O(lgrow + lgcol),最坏时间复杂度O(row * col)

原理

将矩形地图用十字分成四个小矩阵

在四个小矩形相邻的四个面上各随机打通一面墙,使通路导通。

然后对所有小矩形重复之前分割操作

如果矩阵已经无法分割了,也就是行数或列数为一时,就将矩阵内部的墙全部打通

优缺点

生成的迷宫有明显的矩形成分,不自然,适合简单如FPS,ACT等游戏

随机Prim算法

复杂度

  空间:O(row*col),时间:O(墙数=(row-1)*col+row*(col - 1)) 

原理

随机选择一个区域作为当前区域

将区域四周未打通的墙加入列表中

while(列表不为空)

  随机从列表选择一面墙  ?  如果墙两边区域存在一区域未被打通,就打通这面墙,并将这面墙两边区域附近未打通的墙加入列表  ?  从列表中移除这面墙

优缺点

自然的迷宫,很难走,适合真正的迷宫游戏

Kruskal+并查集

复杂度

  空间:O(row*col),时间:O(墙数=(row-1)*col+row*(col - 1)) 

原理

这个算法巧妙的使用了并查集,运用并查集判断整个迷宫的导通问题

把所有墙加入墙列表中

while(墙列表不为空)

  随机从墙列表选择一堵墙,用并查集判断墙两边区域是否导通  ?      不导通就打通这堵墙  ?  从墙列表中移除这堵墙

参考链接

三大迷宫生成算法

随机迷宫生成算法(并查集+生成树)

原文地址:https://www.cnblogs.com/millionsmultiplication/p/9568766.html

时间: 2024-11-10 14:50:18

四种迷宫生成算法的相关文章

[迷宫中的算法实践]迷宫生成算法——Prim算法

       普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小.该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现:1959年,艾兹格·迪科斯彻再次发现了该算法.因此,在某些场合,普里姆

php四种基础排序算法的运行时间比较!

/** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 function bubbleSort($array){ $temp = 0; for($i = 0;$i < count($array) -1;$i++){ for($j = 0;$j < count($array) - 1 -$i;$j++){ if($array[$j] > $arra

php四种基础排序算法的运行时间比较

/** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 function bubbleSort($array){ $temp = 0; for($i = 0;$i < count($array) -1;$i++){ for($j = 0;$j < count($array) - 1 -$i;$j++){ if($array[$j] > $arra

PHP四种基本排序算法

PHP的四种基本排序算法为:冒泡排序.插入排序.选择排序和快速排序. 下面是我整理出来的算法代码: 1. 冒泡排序: 思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数来. //简单版: function bubbleSort($arr) { $n = count($arr); for($i=1;$i<$n;$i++) {   //冒泡的轮数(最多$n-1轮) for($j=0;$j<$n-1;$j++) {   //每一轮冒泡(两两比较,大者后移) if($a

JVM的判断对象是否已死和四种垃圾回收算法总结

面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸.饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾.判断对象是否已死有引用计数算法和可达性分析算法. 1.引用计数算法 给每一个对象添加一个引用计数器,每当有一个地方引用它时,计数器值加 1:每当有一个地方不再引用它时,计数器值减 1,这样只要计数器的值不为 0,就说明还有地方引用它,它就不是无用的对象.如下图,对象 2 有 1 个引用,它的引用计数器值为 1,对象

PHP 四种基本排序算法的代码实现

许多人都说算法是程序的核心,算法的好坏决定了程序的质量.作为一个初级phper,虽然很少接触到算法方面的东西.但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具.这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路. 前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序.$arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序列

PHP 四种基本排序算法的代码实现(2)

许多人都说算法是程序的核心,算法的好坏决定了程序的质量.作为一个初级phper,虽然很少接触到算法方面的东西.但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具.这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路. 前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序. $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序

四种nlogn排序算法代码

1.快速排序:不稳定排序,最好情况O(nlogn),最差情况O(n^2).平均情况在所有nlogn排序中最快的排序 快速排序分两步第一步是将l-r区间进行分块(假设将区间最后一个作为关键字)前面一块的数比小于等于关键字,后面一块大于关键字,并返回第一个大于关键字的位置,即函数partition第二部是对l~pos-1 和pos+1~r分别进行快速排序. 递归式:int partition(int l,int r){    int k=r;    while(l<r)    {        in

PHP实现四种基本排序算法

前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序. $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 代码实现:$arr=array(1,43,54,62,21,66,32,78,36,76,39);  f