文章目录

  • 前言
  • 一、什么是(DFS)深度优先算法?
    • 深度优先算法实现步骤
      • 1.引入库
      • 2.初始化参数
      • 3.Turtle画方格函数
      • 4.开始生成数组并调用Turtle画图
  • 二、什么是(BFS)广度优先算法?
    • 广度优先算法实现步骤
      • 1.引入库
      • 2.初始化参数
      • 3.Turtle画方格函数
      • 4.开始生成数组并调用Turtle画图
  • 总结

前言

最近学习了随机生成迷宫的算法, 分享学习经验以及碰到的问题点。目前学习两个算法 生成随机地图, 深度优先算法和广度优先算法来生成迷宫。比较下他们的不同点。

在程序中,我们用数组M表示所有的单元格子的属性,并用turtle 库来画图。用红色单元格来表示当前遍历到单元格。

一、什么是(DFS)深度优先算法?

简单来说它是一头扎到底的玩法。我们选择一条支路,尽可能不断地深入,如果遇到死路就往回退,回退过程中如果遇到没探索过的支路,就进入该支路继续深入。如此循环反复直到把所有的单元格都遍历了。

深度优先算法实现步骤

1.引入库

代码如下:

import random
import numpy as np
from turtle import *
import time

2.初始化参数

代码如下:

#初始化参数
num_rows = 20 # 生成迷宫的行数
num_cols = 20 # 生成迷宫的列数M = np.zeros((num_rows, num_cols, 5), dtype=np.uint8)
# 阵列M将保存每个单元的阵列信息。
# 前四个坐标告诉墙壁在那些边上是否存在
# 和第五个指示在搜索中是否已访问该单元格。
# M【上,右,下,左,是否被访问】# 我们先把第一个单元格最和后一个墙打开。
M[0, 0, 0] = 1
M[num_rows-1, num_cols-1, 2] = 1#如下是turtle模块的初始化
tracer(0)# 最快生成图
ht()# 隐藏画笔
pensize(1)#画笔大小设为1

3.Turtle画方格函数

代码如下:

def pengoto(x, y):up()goto(x, y)down()def drawing(r, c, M):x = 20*c-200y = 200-20*rpengoto(x, y)for i in range(4):if M[i] == 1:pencolor('blue')fd(1)pencolor('white')fd(19)right(90)else:pencolor('blue')fd(20)right(90)

4.开始生成数组并调用Turtle画图

# 设置开始的行和列
r = 0
c = 0
history = [(r, c)]  # 这个是历史访问的单元格列表。
n = 0  # 砸墙的数量。
# 从初始单元个一路开墙并进入下一个单元格,如果无路可走则返回。
# 我们使用while循环来执行此操作,重复该循环直到n=所有的单元格数-1.说明所有的单元格都是通的了。
while history:M[r, c, 4] = 1  #将此位置指定为已访问#检查相邻单元格是否可移动去,注意上下左右的边界。check = []if c > 0 and M[r, c-1, 4] == 0:check.append('L')if r > 0 and M[r-1, c, 4] == 0:check.append('U')if c < num_cols-1 and M[r, c+1, 4] == 0:check.append('R')if r < num_rows-1 and M[r+1, c, 4] == 0:check.append('D')if len(check): #如果有单元可以去history.append([r, c])n += 1move = random.choice(check)#随机打开一堵墙# 注意数组[上, 右,下,左,1]if move == 'L':  M[r, c, 3] = 1c = c-1M[r, c, 1] = 1if move == 'U':M[r, c, 0] = 1r = r-1M[r, c, 2] = 1if move == 'R':M[r, c, 1] = 1c = c+1M[r, c, 3] = 1if move == 'D':M[r, c, 2] = 1r = r+1M[r, c, 0] = 1else:  #如果发现没有下个单元格可以去,我们要回溯。r, c = history.pop()# 红色显示当前单元格子clear()#清理下,不然内存会被占用fillcolor("red")begin_fill()drawing(r, c, M[r, c])end_fill()# 调用turtle画图显示当前整个地图状态。for i in range(num_rows): for j in range(num_cols):drawing(i, j, M[i, j])update()#更新下,不然turtle会卡死time.sleep(0.5)if n == num_cols*num_rows-1:  # 当砸墙的数量等于单元格子的数量-1时结束循环。breakdone()

二、什么是(BFS)广度优先算法?

广度优先搜索是按层来处理顶点,距离开始点最近的那些顶点首先被访问,而最远的那些顶点则最后被访问,这个和树的层序变量很像,BFS的代码使用了一个队列。Prim

广度优先算法实现步骤

1.引入库

代码如下:

import random
import numpy as np
from turtle import *
import timet

2.初始化参数

代码如下:

#初始化参数
num_rows = 20 # 生成迷宫的行数
num_cols = 20 # 生成迷宫的列数M = np.zeros((num_rows, num_cols, 5), dtype=np.uint8)
# 阵列M将保存每个单元的阵列信息。
# 前四个坐标告诉墙壁在那些边上是否存在
# 和第五个指示在搜索中是否已访问该单元格。
# M【上,右,下,左,是否被访问】# 我们先把第一个单元格最和后一个墙打开。
M[0, 0, 0] = 1
M[num_rows-1, num_cols-1, 2] = 1#如下是turtle模块的初始化
tracer(0)# 最快生成图
ht()# 隐藏画笔
pensize(1)#画笔大小设为1

3.Turtle画方格函数

代码如下:

def pengoto(x, y):up()goto(x, y)down()def drawing(r, c, M):x = 20*c-200y = 200-20*rpengoto(x, y)for i in range(4):if M[i] == 1:pencolor('blue')fd(1)pencolor('white')fd(19)right(90)else:pencolor('blue')fd(20)right(90)

4.开始生成数组并调用Turtle画图

# 设置开始的行和列
r = 0
c = 0
history = [(r, c)]  # 这个是历史访问的单元格列表。
n = 0  # 砸墙的数量。
while history:# 随机选择一个可以敲墙的单元格r, c = random.choice(history)M[r, c, 4] = 1  # 把单元设成以访问history.remove((r, c))check = []
#如果随机选择的单元格具有多个边
#将其连接到现有的迷宫,if c > 0:if M[r, c-1, 4] == 1:check.append('L')elif M[r, c-1, 4] == 0:history.append((r, c-1))M[r, c-1, 4] = 2if r > 0:if M[r-1, c, 4] == 1:check.append('U')elif M[r-1, c, 4] == 0:history.append((r-1, c))M[r-1, c, 4] = 2if c < num_cols-1:if M[r, c+1, 4] == 1:check.append('R')elif M[r, c+1, 4] == 0:history.append((r, c+1))M[r, c+1, 4] = 2if r < num_rows-1:if M[r+1, c, 4] == 1:check.append('D')elif M[r+1, c, 4] == 0:history.append((r+1, c))M[r+1, c, 4] = 2
# 随机前往一个边界墙.if len(check):n+=1move = random.choice(check)if move == 'L':  # [上,右,下,左,1]M[r, c, 3] = 1c = c-1M[r, c, 1] = 1if move == 'U':M[r, c, 0] = 1r = r-1M[r, c, 2] = 1if move == 'R':M[r, c, 1] = 1c = c+1M[r, c, 3] = 1if move == 'D':M[r, c, 2] = 1r = r+1M[r, c, 0] = 1# 红色方格显示当前单元格子位置clear()#清理下,不然内存会一直被占用。fillcolor("red")begin_fill()drawing(r, c, M[r, c])end_fill()# 调用turtle画图显示当前整个地图状态。for i in range(num_rows): for j in range(num_cols):drawing(i, j, M[i, j])update()#需要跟新下,不然会卡死time.sleep(0.5)if n == num_cols*num_rows-1:  # 当砸墙的数量等于单元格子的数量-1时结束循环。breakdone()

总结

1、深度优先算法:是对每一个可能的分支路径深入到不能再深入为止,深度优先法生成的迷宫扭曲,有着一条明显的主路。
2、广度优先算法:系统地展开并检查图中的所有节点,直到遍历完成。

程序生产的图片如下:

视频如下:

深度优先算法和广度优先算法的生成迷宫

算法自动生成迷宫地图相关推荐

  1. 自动生成sitemap地图PHP代码

    自动生成sitemap地图php代码,无需调用数据库,适用于百度站长提交,需要php的环境,本代码是通过php运行的. 代码如下: <?php $dom = new DOMDocument(&q ...

  2. 帝国cms自动生成sitemap地图

    帝国cms自动生成sitemap地图的方法, 新建自定义页面,复制以下代码,注意把www.tyyjyzs.com改成自己的网址,提交生成,刷新所以自定义页面即可 <?='<?xml ver ...

  3. php自动生成网站地图txt,织梦网站地图生成插件+发布文章后自动生成地图

    织梦网站地图生成插件,可同时在网站根目录生成5种地图文件. 下载地址(根据自己网站编码选择安装) 百度网盘 提取码: 3bjg 安装好后的生成菜单在模块一栏里面 如果你想把生成网站地图这个菜单放在生成 ...

  4. python自动寻路算法_PHP生成迷宫及自动寻路算法详解

    如何使用PHP生成迷宫以及寻路求解?本文主要介绍了PHP生成迷宫及自动寻路算法,并对PHP生成迷宫及自动寻路算法详解.希望对大家有所帮助. 本文实例讲述了PHP树的深度编历生成迷宫及A*自动寻路算法. ...

  5. 计算机风格学,由风格学习算法自动生成大规模手写字体

    北大计算机研究所(http://www.icst.pku.edu.cn/content/content_6622.htm) - 计算机所连宙辉老师参加SIGGRAPH Asia 论文:Automati ...

  6. java生成迷宫_java怎么生成迷宫地图

    package cn.zhongZw.model; import java.util.ArrayList; import java.util.Random; public class MazeMode ...

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

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

  8. java迷宫生成代码_maxe.java 源代码在线查看 - Java Maze 计算机自动生成迷宫 资源下载 虫虫电子下载站...

    public class Maxe{ private int startI, startJ; // 入口 private int endI, endJ; // 出口public void setSta ...

  9. c语言随机prim算法的迷宫生成,Prim算法生成迷宫

    初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...

  10. ThoughtWorks公司——算法岗位作业题(计算机生成迷宫)

                               ThoughtWorks公司算法岗位面试经历总结 一.面试的具体流程: 1.面试时间:8月22日(周三)15:00 2.公司地址:成都市高新区天府 ...

最新文章

  1. Python:Scrapy的安装和入门案例
  2. docker 数据卷 volume
  3. 操作多个表_8_不等值连接
  4. JAVA基础面试中的几个问题
  5. 解决Nginx与mysql勾结的错误
  6. javascript --- 利用节点关系访问HTML元素
  7. LeetCode-计数质数
  8. hive表ddl导出_Flink 1.11 与 Hive 批流一体数仓实践
  9. python绘制曲线y=2x+5_使用python动态生成波形曲线的实现
  10. 海康8700联网网关如何通过GB28181接入安防摄像头互联网直播流媒体解决方案EasyGBS实现web端无插件直播
  11. HIVE的基本使用05(HSQL调优)
  12. [渝粤教育] 武汉大学 唐诗艺术 参考 资料
  13. 碳排放权交易管理办法即将施行,你知道火电厂的碳排放是怎么算出来的吗?
  14. 笔记本不用fn也能用功能键
  15. 翻译:《Pro CSS and HTML Design Patterns》简介、总览和目录
  16. winpe加载raid_为WinPE添加RAID卡驱动的几种步骤
  17. JSP开发模型与MVC设计模型
  18. 电脑密码忘了怎么解除?最简单操作的方法
  19. react中constructor( )和super( )详解
  20. 军犬舆情:全流程服务打造舆情管理闭环

热门文章

  1. Python 列表内【自定义排序】
  2. Android studio底部Logcat模块不见了以及Locat日志中包含了很多无用的错误日志筛选方法
  3. 解决Word多级列表章标题第一章与节标题1.1排序混乱问题
  4. HTML下拉菜单(超详细):
  5. AI芯片:Edge TPU(谷歌出品)【在边缘(edge)设备上运行的“专用集成芯片”】【量化操作:Edge TPU使用8 位权重进行计算,而通常使用32位权重。所以我们应该将权重从32位转换为8位】
  6. Python高级数据处理与可视化
  7. 工业镜头视场、倍率、焦距之间的关系
  8. PHPstorm设置字体大小
  9. 服务器上网页怎么压缩文件,如何在服务器端实现文件自动压缩和解压
  10. 被称为史上最高效学习方法——费曼学习法