本以为Prime迷宫生成算法和图论的Prime算法有什么关联,貌似并没有。

Prime迷宫生成算法的原理:

(1)初始地图所有位置均设为墙

(2)任意插入一个墙体进墙队列

(3)判断此时墙体是否可以设置为路(判断依据在于上下左右四个位置是否只有一个位置是路)

(4)若设置为路,则将该位置周围(上下左右)的所有插入队列,接着执行(5);若无法设置为路,直接执行(5)

(5)从墙队列中删去当前位置所在节点

(6)若墙队列不为空,则从队列中随机选取一面墙重新执行(3),直到墙队列为空

看代码,非常简单:

static const int L = 44;void CreateMaze() {int Maze[L][L] = { 0 };//最外围设置为路,可以有效的保护里面一层墙体,并防止挖出界for (int i = 0; i < L; i++) {Maze[i][0] = 1;Maze[0][i] = 1;Maze[L - 1][i] = 1;Maze[i][L - 1] = 1;}//墙队列,包括X , Yvector<int> X;vector<int> Y;//任取初始值X.push_back(2);Y.push_back(2);//当墙队列为空时结束循环while (X.size()) {//在墙队列中随机取一点int r = rand() % X.size();int x = X[r];int y = Y[r];//判读上下左右四个方向是否为路int count = 0;for (int i = x - 1; i < x + 2; i++) {   for (int j = y - 1; j < y + 2; j++) {if (abs(x - i) + abs(y - j) == 1 && Maze[i][j] > 0) {++count;}}}if (count <= 1) {Maze[x][y] = 1;//在墙队列中插入新的墙for (int i = x - 1; i < x + 2; i++) {for (int j = y - 1; j < y + 2; j++) {if (abs(x - i) + abs(y - j) == 1 && Maze[i][j] == 0) {X.push_back(i);Y.push_back(j);}}}}//删除当前墙X.erase(X.begin() + r);Y.erase(Y.begin() + r);}//设置迷宫进出口Maze[2][1] = 1;for (int i = L - 3; i >= 0; i--) {if (Maze[i][L - 3] == 1) {Maze[i][L - 2] = 1;break;}}//画迷宫for (int i = 0; i < L; i++){for (int j = 0; j < L; j++) {if (Maze[i][j] == 1) printf("  ");else printf("国");}printf("\n");}
}

代码要简单不少,但是个人觉得效果还不如深度优先迷宫算法,但是不得不承认prime迷宫赛诺菲生成的迷宫更让人眼花缭乱。

附:

一、回答 abs(x - i) + abs(y - j) == 1 看不懂的问题。

已知此时所在位置(x,y),我需要通过上下左右四个方向所在位置的状态来判断是否需要打通(x,y)位置的墙壁。

上下左右意味着(x-1,y);(x+1,y);(x,y-1);(x,y+1),意味着 abs(x - i) + abs(y - j) == 1

随机迷宫生成算法——prime算法相关推荐

  1. 随机迷宫生成算法——深度优先算法

    迷宫是我们小时候经常玩的游戏,如何用代码来快速生成上面这种迷宫呢? 迷宫算法有三大算法:深度优先算法.prim算法和递归分割算法.这里用的是深度优先算法,在此说一下算法思路,希望对各位有所帮助. 首先 ...

  2. 随机迷宫生成算法浅析

    摘要 本文对随机迷宫生成进行了初步的研究和分析,并给出了两种不同的生成算法.最终的算法结合了图的深度优先遍历.通过对比两种算法之间,可发现,在实际问题中,结合了离散数学的方法往往非更有效率且效果更佳. ...

  3. flutter生成源代码_Flutter随机迷宫生成和解迷宫小游戏功能的源码

    此博客旨在帮助大家更好的了解图的遍历算法,通过Flutter移动端平台将图的遍历算法运用在迷宫生成和解迷宫上,让算法变成可视化且可以进行交互,最终做成一个可进行随机迷宫生成和解迷宫的APP小游戏.本人 ...

  4. 随机迷宫 c语言思路,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  5. c语言随机迷宫生成方法,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  6. 随机迷宫c语言实验报告,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  7. c语言生成迷宫算法,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  8. 【Prim迷宫算法】随机迷宫生成

    最近在学Android开发,老师让我们自己做个应用,我就想做个简单的Roguelike RPG小游戏.由于要用到迷宫,所以在网上学习了一下Prim迷宫算法,先用C++手撸了一个简单的模板. Prim算 ...

  9. html5 自动生成迷宫,HTML5 Canvas随机迷宫生成动画

    JavaScript 语言: JaveScriptBabelCoffeeScript 确定 class Line { constructor(x, y, a, c) { this.x1 = x; th ...

最新文章

  1. 前台特效(2)回到顶部
  2. Python学习之路 (一)开发环境搭建
  3. 操作系统存储器管理实验报告_献上膝盖!华为工程师抛出一份堪称“举世无双”操作系统笔记...
  4. 05 | 数组:为什么很多编程语言中数组都从0开始编号?
  5. 数据库-MySQL-JDBC-execute、executeUpdate、executeQuery
  6. 利用java poi对excel表的读写操作
  7. DaNet: Decompose-and-aggregate Network for 3D Human Shape and Pose Estimation
  8. APICloud学习笔记之div样式设置套路
  9. 重t2加权是什么意思_魔兽世界怀旧服:详解盗贼T2.5套装,别犹豫真香
  10. dlibdotnet 人脸相似度源代码_HAAR与DLib的实时人脸检测之实现与对比
  11. 初识SRC漏洞平台提交漏洞
  12. PageHelper 分页,total总数等于每页数量的问题解决
  13. ssm基于微信小程序的游泳馆管理系统 uinapp 计算机毕业设计
  14. 【PTA】 试试手气
  15. 穿越美丽秋色---黄草梁
  16. ApacheCN JavaScript 译文集 20211122 更新
  17. 稀疏矩阵向量乘(SpMV)
  18. 我要你—驴得水—钢琴简谱
  19. 浏览器无痕模式的使用
  20. 成长不可或缺的財富——肥皂剧和八卦节目带给我的成长

热门文章

  1. C语言<常用函数接口>
  2. TensorFlow交叉熵函数
  3. 摆脱学校机房老师的电脑控制(即摆脱控制软件的控制)【详细版】
  4. 最新版大厂字节跳动笔试题(含答案)
  5. 生活片段(3)我所见过的母亲2
  6. 前端开发面试经验之苏宁
  7. javaweb之EL表达式和JSTL(总体第七篇)
  8. Eigen 求解两个向量的夹角
  9. 虚拟变量和独热编码的区别(Difference of Dummy Variable One Hot Encoding)
  10. SpringBoot通过AOP实现系统日志记录(一)-Controller层日志监控