Recursive division method

       Mazes can be created with recursive division, an algorithm which works as follows: Begin with the maze's space with no walls. Call this a chamber. Divide the chamber with a randomly positioned wall (or multiple walls) where each wall contains a randomly positioned passage opening within it. Then recursively repeat the process on the subchambers until all chambers are minimum sized. This method results in mazes with long straight walls crossing their space, making it easier to see which areas to avoid.

       For example, in a rectangular maze, build at random points two walls that are perpendicular to each other. These two walls divide the large chamber into four smaller chambers separated by four walls. Choose three of the four walls at random, and open a one cell-wide hole at a random point in each of the three. Continue in this manner recursively, until every chamber has a width of one cell in either of the two directions.

Recursive Maze generation

 

递归分割算法

        可以用递归分割法创建迷宫,算法的工作原理如下:

        1.开始创建迷宫,使整个空间没有壁,我们称之为“室”。

        2.在随机位置生成壁将室分割为两个子室,并在壁上随机开孔,使子室联通。

        3.重复步骤2,直到所有子室全部不可分割(即子室某一个维度等于1)。

        例如,在矩形迷宫中,在任意点建立彼此垂直的两个壁。 这两个壁将大腔室分成由四个壁分开的四个较小腔室。 随机选择四个墙壁中的三个,并在三个墙壁的随机点处打开一个单元格的孔。 继续以这种方式递归,直到每个室在两个方向中的任一个方向上具有一个单元的宽度。

下面我们来做C#的代码实现:

/// <summary>
/// 递归回溯法迷宫生成法
/// </summary>
/// <param name="startX"></param>
/// <param name="startY"></param>
/// <param name="widthLimit"></param>
/// <param name="heightLimit"></param>
private void RecursiveBacktrack(int startX, int startY, int widthLimit, int heightLimit)
{
    PathStack = new Stack<Point>();
    //周围未连通格坐标
    ];
    //周围未标记格的数量
    ;

    //将起点作为当前格
    int currentX = startX;
    int currentY = startY;

    //标记起点
    MazeMap[currentX, currentY] = UnBlock;
    CreateScript.Add(new ScriptPoint(new Point(currentX, currentY), false));
    do
    {
        //检测周围有没有未连通的格子
        blockNum = ;
        //检查上方
         && MazeMap[currentX, currentY - ] == Block)
        {
            blockPos[blockNum] = ;
            blockNum++;
        }
        //检查右侧
        , currentY] == Block)
        {
            blockPos[blockNum] = ;
            blockNum++;
        }
        //检查下方
        ] == Block)
        {
            blockPos[blockNum] = ;
            blockNum++;
        }
        //检查左侧
         && MazeMap[currentX - , currentY] == Block)
        {
            blockPos[blockNum] = ;
            blockNum++;
        }

        //选出下一个当前格
        )
        {
            //随机选择一个邻格
            blockNum = _r.Next(, blockNum);
            //把当前格入栈
            PathStack.Push(new Point(currentX, currentY));
            //连通邻格,并将邻格指定为当前格
            switch (blockPos[blockNum])
            {
                :
                    MazeMap[currentX, currentY - ] = UnBlock;
                    CreateScript.Add(), false));
                    currentY -= ;
                    break;
                :
                    MazeMap[currentX + , currentY] = UnBlock;
                    CreateScript.Add(, currentY), false));
                    currentX += ;
                    break;
                :
                    MazeMap[currentX, currentY + ] = UnBlock;
                    CreateScript.Add(), false));
                    currentY += ;
                    break;
                :
                    MazeMap[currentX - , currentY] = UnBlock;
                    CreateScript.Add(, currentY), false));
                    currentX -= ;
                    break;

            }
            //标记当前格
            MazeMap[currentX, currentY] = UnBlock;
            CreateScript.Add(new ScriptPoint(new Point(currentX, currentY), false));
        }
        )
        {
            //将栈顶作为当前格
            Point top = PathStack.Pop();
            currentY = top.Y;
            currentX = top.X;
        }
    } );
}

[迷宫中的算法实践]迷宫生成算法——递归分割算法的更多相关文章

  1. 剑指Offer——回溯算法解迷宫问题(java版)

    剑指Offer--回溯算法解迷宫问题(java版)   以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路.   下面我们来详细讲一 ...

  2. A* search算法解迷宫

    这是一个使用A* search算法解迷宫的问题,细节请看:http://www.laurentluce.com/posts/solving-mazes-using-python-simple-recu ...

  3. 2.2、Softmax Regression算法实践

    Softmax Regression算法实践 有了上篇博客的理论知识,我们可以利用实现好的函数,来构建Softmax Regression分类器,在训练分类器的过程中,我们使用多分类数据作为训练数据: ...

  4. 1.2、Logistics Regression算法实践

     1.1.Logistics Regression算法实践 有了上篇博客的理论准备后,接下来,我们用以及完成的函数,构建Logistics Regression分类器.我们利用线性可分的数据作为训练样 ...

  5. 机器学习算法实践:朴素贝叶斯 (Naive Bayes)(转载)

    前言 上一篇<机器学习算法实践:决策树 (Decision Tree)>总结了决策树的实现,本文中我将一步步实现一个朴素贝叶斯分类器,并采用SMS垃圾短信语料库中的数据进行模型训练,对垃圾 ...

  6. 个性化召回算法实践(一)——CF算法

    协同过滤推荐(Collaborative Filtering Recommendation)主要包括基于用户的协同过滤算法与基于物品的协同过滤算法. 下面,以movielens数据集为例,分别实践这两 ...

  7. kmeans算法实践

    这几天学习了无监督学习聚类算法Kmeans,这是聚类中非常简单的一个算法,它的算法思想与监督学习算法KNN(K近邻算法)的理论基础一样都是利用了节点之间的距离度量,不同之处在于KNN是利用了有标签的数 ...

  8. 神经网络训练中的Tricks之高效BP(反向传播算法)

    神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 ...

  9. ID3算法 决策树的生成(2)

    # coding:utf-8 import matplotlib.pyplot as plt import numpy as np import pylab def createDataSet(): ...

随机推荐

  1. ECshop设置301最快捷最简单的方法

    ECshop设置301最快捷最简单的方法 在 init.php中加入以下代码 if (strtolower($_SERVER['SERVER_NAME'])!='www.fz1688.com') { ...

  2. thinking in object pool

    1.背景 对象池为了避免频繁创建耗时或耗资源的大对象,事先在对象池中创建好一定数量的大对象,然后尽量复用对象池中的对象,用户用完大对象之后放回对象池. 2.问题 目前纵观主流语言的实现方式无外乎3个步 ...

  3. 【转】如何判断Javascript对象是否存在

    Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: ...

  4. 没有 RunInstallerAttribute.Yes 的公共安装程序。在 C:/Program/xx.exe 程序集中可能可以找到

    今天在装服务的时候,装了半天总是提示 没有 RunInstallerAttribute.Yes 的公共安装程序.在 C:/Program/xx.exe 程序集中可能可以找到“Yes”属性. 才发现同事 ...

  5. SSAS:菜鸟摸门

    官方:SSAS 多维模型 Analysis Services 多维解决方案使用多维数据集结构来分析多个维度之间的业务数据. 多维模式是 Analysis Services 的默认服务器模式. 它包括针 ...

  6. 基于Java的数据采集(终结篇)

    关于写过关于JAVA采集入库的三篇文章: 基于Java数据采集入库(一):http://www.cnblogs.com/lichenwei/p/3904715.html 基于Java数据采集入库(二) ...

  7. MINE

    MINE MINE is an app for the nearly 1.2 million songwriters, composers, musicians, and publishers who ...

  8. [原]SQLite的学习系列之获取数据库版本二

    本系列文章主要是使用C++语言来调用其API,达到管中窥豹的目的.另外本文使用的开发环境为mac + clion,并且基于SQLite 3.7.14来进行开发. 一.去下载sqlite-amalgam ...

  9. Ext.grid.GridPanel属性及方法等

    1.Ext.grid.GridPanel主要配置项:store:表格的数据集columns:表格列模式的配置数组,可自动创建ColumnModel列模式autoExpandColumn:自动充满表格未 ...

  10. PE渲染引擎 一

    PE是我业余时间做的一个纯dx11的渲染框架.主要就是练手.如果有时间,会把它“扩展”成真正的引擎(标配至少要有个对应的编辑器吧 -_!!). 目前实现的有: obj文件加载,binormal计算. ...