快要大四了,要赶紧复习下数据结构好找工作,哈哈哈哈哈,所以最近在看图相关的算法,光看书没什么感觉,准备实践一下,写个迷宫算法

主要用Prim算法和DFS算法实现了一遍,没有用BFS是因为Prim的思路跟BFS的其实差不太多,但是看别的博客都说Prim比较自然

思路其实大同小异,主要为:常见迷宫(即任意两点间都能够找到路径,且仅有一条成功路径),迷宫可看做一组连通图(用数组储存),默认所有点间都为墙,我们需要做的就是遍历整个图中所有的点,并且不重复访问,在遍历图的过程中将相邻(指的是上下左右相邻)的两个点间的墙随机打通;满足条件的常见算法有:Prim,Kruskal,DFS,BFS,(另外有个博客中写到了递归分割算法,但是因为本菜很懒没有去具体了解)

定义数组:设我们要做一个row*column的迷宫,那么我们的数组的行列应为2*row+1和2*cloumn+1 (不理解为什么可以看这个表情  |O|O|    O为点,|为墙)

首先我们要造一堆墙围着相邻的格子,用于之后去打破如图:

代码如下:

 //初始化一个地图  默认所有路不通//row行表示的是刚开始空白格子的行数,而格子之间还有墙壁,所以最终产生的二维数组大小实际为(2row+1) * (2colum+1)//看到其他博客有其他的思路也可以,可以凭自己爱好:例如 空间:O(row*col),时间:O(墙数=(row-1)*col+row*(col - 1))//默认为7行6列private int row = 7;private int column = 6;private int[,] LabId;//存放迷宫的数组private Vector2[,] Pos;public void Init(){int r = 2 * row + 1, c = 2 * column + 1;LabId = new int[r, c];for (int i = 0; i < r; i++) //将所有格子都设为墙for (int j = 0; j < c; j++)LabId[i, j] = 0;//0 为墙 1为路//中间格子放为1for (int i = 0; i < row; i++)for (int j = 0; j < column; j++)LabId[2 * i + 1, 2 * j + 1] = 1;//0 为墙 1为路//普里姆算法//accLabPrime();//深度优先搜索算法//accLabDFS();}

1.Prim算法实现的方式:随机打通相邻(上下左右)的墙壁

 /// <summary>/// 通过Prim算法处理数组 生成最后的迷宫/// 思路: 随机找最近的点访问(每个点只访问一次,直到访问完所有的路),会生成一条访问所有点的路(无序),在随机找下一个点的时,把之前相邻的两个格子之间的墙壁打通/// </summary>public void accLabPrime(){//acc存放已访问队列,noacc存放没有访问队列int[] acc, noacc;int count = row * column;int accsize = 0;//记录访问过点的数量acc = new int[count];noacc = new int[count];//row上各方向的偏移  column各方向的偏移  0左 1右 3上 4下int[] offR = { -1, 1, 0, 0 };int[] offC = { 0, 0, 1, -1 };//四个方向的偏移 左右上下int[] offS = { -1, 1, row, -row };for (int i = 0; i < count; i++){acc[i] = 0;noacc[i] = 0;}//起点acc[0] = Random.Range(0, count);int pos = acc[0];//第一个点存入noacc[pos] = 1;while (accsize < count){//取出现在的点int x = pos % row;int y = pos / row;int offpos = -1;//用于记录偏移量int w = 0;//四个方向都尝试一遍 直到挖通为止while (++w < 5){//随机访问最近的点int point = Random.Range(0, 4);  //包含min但不包含max。int repos;int move_x, move_y;//计算出移动方位repos = pos + offS[point];move_x = x + offR[point];move_y = y + offC[point];//判断移动是否合法if (move_y > -1 && move_x > -1 && move_x < row && move_y < column && repos >= 0 && repos < count && noacc[repos] != 1){noacc[repos] = 1;acc[++accsize] = repos;pos = repos;offpos = point;//相邻的格子中间的位置放1 LabId[2 * x + 1 + offR[point], 2 * y + 1 + offC[point]] = 1;break;}else{if (accsize == count - 1)return;continue;}}if (offpos < 0){//周边没有找到能走的路了   从走过的路里重新找个起点 pos = acc[Random.Range(0, accsize + 1)];}}}

生成效果如下:

2.深度优先搜素算法实现方式:思路同样也是随机打通相邻(上下左右)的墙壁

 /// <summary>///  考虑到bfs和prim在思路上有些相似  在这里选择实现DFS会更有趣一些/// </summary>public void accLabDFS(){int[] lab;//访问队列int count = row * column;//初始化数组lab = new int[count];for (int i = 0; i < count; i++)lab[i] = 0;for (int v=0;v<count ;v++ ) {//从第0个点开始遍历if (lab[v] != 1) {DFS(lab, v);}}}/// <summary>/// 使用DFS算法,借助递归思想访问某一顶点v,找v点附近且未被访问的点w,在找w附近未被访问的点....(循环...),直到没有继续能找下去的点,依次退回最近被访问的点,如果还有该顶点的其他邻居没有被访问,就从邻居点开始继续搜索,把相邻的部分格子打通/// </summary>/// <param name="LabG"></param>/// <param name="v"></param>public void DFS(int[] LabG, int v){//访问顶点LabG[v] = 1;//四个邻居  上下左右int[] neighbor = { v + row, v - row, v - 1, v + 1 };//Row上个方向的偏移    Column上各方向的偏移  上下左右int[] offR = { 0, 0, -1, 1 }, offC = { 1, -1, 0, 0 };int[] tag = { -1, -1, -1,-1 };//记录打通位置int n = 0;//打通的次数while (n<4) {//随机打通一个方向int i = Random.Range(0, 4);if (tag[i] == 1) continue;tag[i] = 1;n++;int w = neighbor[i];//该点不存在if (w > LabG.Length - 1 || w < 0)continue;//取出现在的v点的位置int x = v % row;int y = v / row;//该点没有该方向上的邻居if (i == 0 && y == column - 1) continue;if (i == 1 && y == 0) continue;if (i == 2 && x == 0) continue;if (i == 3 && x == row - 1) continue;//未访问的邻居    if (LabG[w] != 1){//相邻的格子中间的位置放1 LabId[2 * x + 1 + offR[i], 2 * y + 1 + offC[i]] = 1;DFS(LabG, w);}}}

效果图如下:

感觉两种效果差不多,但是明显DFS的代码量更少一些,哈哈哈哈哈,不过多生成几次会发现Prim好像确实更自然一些

是不是很简单捏?

可能写的不是很好,但是小菜鸡会茁壮成长的!!!

虽然说不知道你们需不需要,但是贴心的我还是把unity的demo准备好了,基本不用考虑版本匹配的问题,因为没写多少行代码.哈哈哈

gayhub的地址: https://github.com/Bigbao123/Labyrinth

许愿:能够顺利成为一名游戏人!

简单生成随机迷宫的算法___Prim和DFS相关推荐

  1. prim算法_自动生成随机迷宫(1)prim算法

          "程序 = 数据  + 算法",一款好的作品不单单是代码的堆砌,还有其灵魂的部分,那就是算法:算法是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...

  2. js迷宫生成与迷宫求解算法

    迷宫问题是一个很经典的问题,本文记叙迷宫的生成和求解(深度优先),完整dome见文章末尾(包括动画演示) 所涉及迷宫为: 方形规则迷宫 只有一个出口和一个入口 路径连续 只有一个解 先看效果: a.迷 ...

  3. 用html js制作迷宫,JavaScript生成随机迷宫详解

    本篇教程介绍了JavaScript生成随机迷宫详解,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入. < #先看生成随机迷宫的代码吧↓ 1 2 3 生成随机迷宫v ...

  4. Python——迷宫生成和迷宫破解算法

    迷宫绘制函数 def draw(num_rows, num_cols, m):image = np.zeros((num_rows * 10, num_cols * 10), dtype=np.uin ...

  5. java 利用dfs生成简单的随机迷宫(效率不高)

    利用深搜可以生成简单的迷宫,思路就是从起点执行dfs.当然你要首先用一个容器将四个方向的随机数装起来保证一定可以走.一个点一旦被走过就不会再走那个店,利用递归思想,因为这个点如果不成功在之前回溯的时候 ...

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

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

  7. python随机生成一个地区地址_Python生成随机MAC地址

    利用python代码生成一个随机的MAC地址,使用python网络编程时或可用上,如果使用scapy模块则可直接利用RandMAC()函数来生成MAC. python 复制代码 代码如下: impor ...

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

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

  9. 随机迷宫生成算法——prime算法

    本以为Prime迷宫生成算法和图论的Prime算法有什么关联,貌似并没有. Prime迷宫生成算法的原理: (1)初始地图所有位置均设为墙 (2)任意插入一个墙体进墙队列 (3)判断此时墙体是否可以设 ...

  10. 迷宫生成与路径规划算法-Python3.8-附Github代码

    MazeProblem 简单介绍一下 该项目不过是一个平平无奇的小作业,基于python3.8开发,目前提供两种迷宫生成算法与三种迷宫求解算法,希望对大家的学习有所帮助. 项目如果有后续的跟进将会声明 ...

最新文章

  1. SAP MM 不常用事务代码之MB59
  2. matlab中cell用法
  3. 如何在Ubuntu上使用ssh-add永久添加私钥? [关闭]
  4. 使用intelliJ创建 spring boot + gradle + mybatis站点
  5. Javascript设置cookie和获取cookie
  6. 学习OpenGL:笔记一
  7. 网站使用QQ登录问题小结
  8. 详解log4j2(下) - 按日志级别区分文件输出
  9. 评价的等级优良差_满意程度等级划分
  10. 对象和json相互转换
  11. 【转】详解:oracle10G 数据库名、实例名、ORACLE_SID
  12. centos llvm安装_CentOS7.x安装LLVM6.0
  13. 电机选型及校核方法总结
  14. 云计算数据中心是什么,云计算数据中心和传统IDC有何区别?
  15. 十年之前..., 十年之后...
  16. 高中数学必考知识点:二元一次不等式(组)及简单的线性规划问题
  17. Datepicker日期选择器插件
  18. CCM单电压环BUCK开关变换器传递函数理论分析与simulink估算对比
  19. 关于echarts图例lengend自定义
  20. 虚拟机下Linux图形界面如何全屏

热门文章

  1. 视频图片音乐音效工具等素材网汇总
  2. python自动排版公众号_GitHub - Pidbid/maxpress: MaxPress:MarkDown+Python实现微信公众号一键排版...
  3. @JsonFormat和@DataFormat注解解决前后端日期格式一致性问题
  4. 集团HR人事资源管理系统软件有哪些
  5. 电压跟随器的问答汇总
  6. 高频小信号谐振放大器的matlab仿真,高频小信号谐振放大器的MATLAB仿真
  7. RS485通信和Modbus通信协议
  8. 从苏宁电器到卡巴斯基(第二部)第09篇:我在卡巴的日子 IX
  9. 高一计算机课程教案,高一信息技术《信息及其特征》教案
  10. 人工智能自动驾驶的意义,人工智能自动驾驶汽车