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. [原]quick2.25精灵变灰

    由于quick2.25没有导出shader相应的接口,所以2.25无法直接使用shader. 本文简单介绍如何导出相应接口,同时教大家使用shader 实现精灵变灰 一.编写静态函数,以供导出使用(直 ...

  2. U-boot.lds文件分析

    OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") ...

  3. jQuery 焦点图 旋转木马

    jQuery BxSlider 滑动滚动效果 jQuery Easing 动画效果扩展

  4. 推荐几个学习Node的网址:

    推荐几个学习Node的网址: Nodejs 安装教程 http://jingyan.baidu.com/article/a948d6515d4c850a2dcd2e18.html http://nod ...

  5. 从抽象谈起(三):AOP编程和ASP.NET MVC

    AOP(Aspect oriented programming)面向切面编程.说成切面不容易理解,代码哪里有切面?又不是三维物体.概念不管,我们从其思想来理解这个名词吧. AOP的主要思想是把相同.相 ...

  6. 由于无法创建应用程序域,因此未能执行请求。错误: 0x80070002 系统找不到指定的文件

    前两天安装了一堆补丁后突然发现,原本正常使用了一年的应用系统打不开了,到事件日志中发现有.net framewok 2.0的补丁安装失败的日志,于从从重装补丁开始.到重新注册.net框架,再到所有.n ...

  7. Android View自动生成插件

    在ButterKnife这样强大的注入库出来之后,使用注入进行UI开发已经非常普遍.但考虑到效率.学习成本等问题,findViewById方式仍然是不错的选择. 但是当页面UI变得复杂后,我们从Lay ...

  8. MVC3.0学习笔记之元模型元数据ModelMetaData以及模型元数据提供系统

    模型元数据ModelMetaData是MVC中很重要的概念,它包括但不仅限于 模型的类型,模型包含了哪些属性,属性都是什么类型的,属性上都有什么特性. ASP.NET MVC3.0 提供了默认的模型元 ...

  9. Weblogic 10.3.6生产模式启动

    生产模式启动里需要输入用户名和密码,很麻烦.在域的/security目录下创建文件boot.properties,内容为: username=weblogic password=weblogic123 ...

  10. 不同gdb,相同数据集合并

    众所周知,数据处理是GIS中一项重要且繁琐的工作,处理数据的工具和方法也太多了,在做数据处理的时候,经常会遇到这样的问题:对存储在不同gdb中.并且数据集名称相同的数据进行合并处理: 如图:数据组织如 ...