迷宫生成算法(二)(C++)
二、最小生成树算法之Prim算法
数据结构中的Prim算法是先将一个顶点加入集合,寻找与其最近的顶点加入集合,然后依次寻找与这两个顶点中最近的顶点加入集合,以此类推直到所有顶点都被访问到。
由于迷宫中所有边的权都相同,且生成迷宫需要随机性,所以寻找最近顶点这一步就变为:
随机选取集合中某一顶点,检索其相邻顶点是否被访问过,如果全部被访问过,将这个顶点移除集合,如果尚存在未被访问过的顶点,就随机选择其中一个并连接它们。
最终形成的迷宫如图
由于准备阶段在上一篇文章中已阐述过,本篇只列出算法函数
void Prim()
{int x = 0, y = 0;vector<Map*>rode;//使用向量容器作为集合rode.push_back(start);//start作为根map[x][y]->val = 1;//标记访问过的顶点while (!rode.empty()){Sleep(0);int select = rand() % rode.size();//从集合中随机选取一个顶点x = rode[select]->x;y = rode[select]->y;int v = visit(x, y);if (v == 0){rode.erase(rode.begin()+select);//如果该顶点的相邻顶点全部被访问过,移除它}else{//以下代码为从可访问的顶点中随机选取一个vector<int>put;if (v % 10 == 1)put.push_back(UP);if (v % 100 >= 10)put.push_back(DOWN);if (v % 1000 >= 100)put.push_back(LEFT);if (v >= 1000)put.push_back(RIGHT);int choose = rand() % put.size();//以下代码把要移除的墙涂白if (put[choose] == UP){solidrectangle(x*(RODE + WALL) - RODE / 2, y*(RODE + WALL) - RODE / 2 - WALL, x*(RODE + WALL) + RODE / 2, y*(RODE + WALL) - RODE / 2);y--;}else if (put[choose] == DOWN){solidrectangle(x*(RODE + WALL) - RODE / 2, y*(RODE + WALL) + RODE / 2, x*(RODE + WALL) + RODE / 2, y*(RODE + WALL) + RODE / 2 + WALL);y++;}else if (put[choose] == LEFT){solidrectangle(x*(RODE + WALL) - RODE / 2 - WALL, y*(RODE + WALL) - RODE / 2, x*(RODE + WALL) - RODE / 2, y*(RODE + WALL) + RODE / 2);x--;}else if (put[choose] == RIGHT){solidrectangle(x*(RODE + WALL) + RODE / 2, y*(RODE + WALL) - RODE / 2, x*(RODE + WALL) + RODE / 2 + WALL, y*(RODE + WALL) + RODE / 2);x++;}//将它们互相加入对方的相连顶点集合中rode[select]->push(map[x][y]);map[x][y]->push(rode[select]);//把新顶点加入集合rode.push_back(map[x][y]);map[x][y]->val = 1;}}
}
可以看到最后寻到的路并不曲折
迷宫生成算法(二)(C++)相关推荐
- 迷宫生成算法和迷宫寻路算法
迷宫生成算法和迷宫寻路算法 大学二年级的时候,作为对栈这个数据结构的复习,我制作了一个迷宫生成算法的小程序,当时反响十分好,过了几天我又用自己已经学的DirectX技术制作了DirectX版的程序.这 ...
- 迷宫生成算法---深度优先算法(基于python)
迷宫生成算法---深度优先算法 总体的目录 版权及协议声明 更加舒服的阅读方式 一. 深度优先算法的原理与思路 二.迷宫的制作 迷宫的总体的创建. 三.代码的实现 总体的目录 版权及协议声明 本文章遵 ...
- 随机迷宫生成算法浅析
摘要 本文对随机迷宫生成进行了初步的研究和分析,并给出了两种不同的生成算法.最终的算法结合了图的深度优先遍历.通过对比两种算法之间,可发现,在实际问题中,结合了离散数学的方法往往非更有效率且效果更佳. ...
- c语言 迷宫深度遍历 算法,图的遍历迷宫生成算法浅析
1. 引言 在平常的游戏中,我们常常会碰到随机生成的地图.这里我们就来看看一个简单的随机迷宫是如何生成. 2. 迷宫描述随机生成一个m * n的迷宫,可用一个矩阵maze[m][n]来表示,如图: ...
- [迷宫中的算法实践]迷宫生成算法——Prim算法
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)), ...
- C#三大迷宫生成算法
今天介绍一下很经典的三大迷宫算法的C#实现,即随机普利姆算法,深度优先算法和十字分割(也就是递归分割算法).实现参考了[ActionScript 3] 三大迷宫生成算法一文(生成的迷宫预览图也使用的该 ...
- 随机迷宫生成算法——深度优先算法
迷宫是我们小时候经常玩的游戏,如何用代码来快速生成上面这种迷宫呢? 迷宫算法有三大算法:深度优先算法.prim算法和递归分割算法.这里用的是深度优先算法,在此说一下算法思路,希望对各位有所帮助. 首先 ...
- 随机迷宫生成算法——prime算法
本以为Prime迷宫生成算法和图论的Prime算法有什么关联,貌似并没有. Prime迷宫生成算法的原理: (1)初始地图所有位置均设为墙 (2)任意插入一个墙体进墙队列 (3)判断此时墙体是否可以设 ...
- HTML+CSS+JavaScript 迷宫生成算法 【建议收藏】
最近发现很多人都在写算法类的博客,今天就献丑了使用HTML,CSS和JavaScript制作一个简单的迷宫生成小代码.证明了自己对一些简单的小算法还是可以驾驭的,基本功没有荒废. 迷宫生成有很多种算法 ...
- android迷宫生成算法,【Unity算法实现】简单回溯法随机生成 Tile Based 迷宫
算法学习自 作者eastecho 在IndieNova上发表的文章 简单的使用回溯法生成 Tile Based 迷宫 , 我只是简单做了一下Unity的实现. 基础算法的简单说明 简单说明一下算法步骤 ...
最新文章
- 使用juggle简化网络编程
- 具体分析Struts工作流程
- Android-ConvenientBanner轻松实现广告头效果
- javac编译出现“找不到符号”和软件包不存在的解决
- 怎样更好地使用快捷键?
- 成功解决AttributeError: ‘Series‘ object has no attribute ‘name’
- Oracle区概念总结
- java 控制jsp_JSP学习之Java Web中的安全控制实例详解
- c6011取消对null指针的引用_COM编程攻略(二十二 IDL中的枚举,指针,数组)
- 阿里云、腾讯云、UCloud 、华为云云主机对比测试报告
- Yann LeCun送你的春节大礼:免费学习全部2020春季深度学习课程
- 07_封装丶静态和工具类
- 急需能临时发邮件的临时邮箱 临时邮箱怎么注册 邮箱163注册入口在哪
- C语言 栈的应用 :火车的调度(软硬座)
- win10电脑怎么清理电脑内存
- 人类刚给火星送去Linux系统,以及一款安卓手机芯片
- 让你的工作事半功倍的语音转文字转换器
- J9数字论:区块链+DAO3:去中心化的互联网世界
- .net core 使用 Hangfire 实现定时、延时任务
- 学习通信原理之——从实验中理解频谱/功率谱/功率谱密度(MATLAB演示)