迷宫寻路算法---深度优先算法(的魔改版)(基于python)

【算法详解 | DFS算法】深度优先搜索解走迷宫问题 | 深度优先图遍历 本文将会详细讲解如何使用DFS算法解决走迷宫问题,一篇文章秒杀所有难点!内容简单直观,我家盆栽看完都学会了! 阅读详情

总体目录

  1. 这篇文章里用到的迷宫生成算法的讲解:迷宫生成算法—深度优先算法(基于python)_ghost_him的博客-优快云博客
    建议先看上面的那一篇文章,这篇文章在上面的文章的基础上写的

  2. 首先你能用上文的代码生成这样子的迷宫在这里插入图片描述
    ,那么接下来就开始了.

版权及协议声明

本文章遵循CC BY-NC-SA 4.0协议,即知识共享-署名-非商业性使用-相同方式共享

更加舒服的阅读方式

该文章的pdf版,排版更舒服(其实是因为不会csdn的排版)
文章的pdf版:
链接:https://pan.baidu.com/s/19y-vcSSyCPr5b22cXd3jLw
提取码:2233
代码:
链接:https://pan.baidu.com/s/1Nfj-CZMyU1T0Gz2n2TjXRw
提取码:2233

一. 深度优先算法的原理与思路(上一篇文章的原话,看过的可以直接跳过)

首先来看一下算法导论上的解释:

深度优先搜索总是对最近才发现的结点v的出发边进行探索,直到该结点的所有出发边都被发现为止。一但结点v的所有出发边都被发现,搜索则“回溯”到v的前驱结点(v是经过该结点才被发现的),来搜索该前驱结点的出发边。该过程一直持续到从源结点可以达到的所有结点都被发现为止。如果还存在尚未发现的结点,则深度优先搜索将从这些未被发现的结点中任选一个作为新的源点,并重复同样的搜索过程。该算法重复整个过程,直到图中的所有结点都被发现为止。

用人话的方式来说明:

  1. 选一个起点
  2. 查看周围能够移动的点并随即挑一个移动
  3. 重复步骤2直到周围没有可以移动的点
  4. 回溯一格,即回到到当前位置的上一个位置,并执行步骤2和3

二. 在迷宫中的实现

寻路算法与生成算法是有不同的,生成算法找的是”墙”,而寻路算法找的是路,而且是紧密相连的路.
众所周知,在一个已经生成好的迷宫中,1.每一条路都是与周围的路紧密相连的2.每一条路都有且仅有一条途径到另一条路上

因此在代码中,我们只需要检测路周围四周的格子,如果周围有两条路那么就在探测出来的新的路(即之前未被检测过的路)上重复这个动作,直到周围只有一条路的时候停止这个动作.

以下图为例:
在这里插入图片描述
蓝色为当前执行代码的方块,绿色为回溯的方块(即上一个方块),黄色为检测到的方块
首先从起点开始在这里插入图片描述
蓝色周围有一个未被检测过的方块,
那么接下来就应该在黄色的方块上执行这个相同的操作:在这里插入图片描述
直到碰到岔路口,那么就是一种新的情况:在这里插入图片描述
这部分就是我的算法与深度优先算法的不同之处了:

在这个情况下,我是同时在两个黄色的方块上执行相同的操作,而不是从中挑一条先走到底再挑两外的一条路走: 在这里插入图片描述

接下来就是相当于运行了两个方法来继续运行,直到每条路都走到尽头了: 在这里插入图片描述
那么就有一个问题:如果遇到了终点怎么办?

我们先设迷宫的终点在右下角: 在这里插入图片描述
由于边界处的墙最多只能与一条路紧密连接,因此只需要设这个终点旁边的路为终点方块即可.

由上面的寻路的过程中,我们可以知道,每个路都是指向上一条路的,从而最终指向起点在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因此只需要一个递归,就能够将这些路的属性全部设置好,最后就能输出了.

三. 用代码来实现

完整的代码

import time
import random
import sys

#===setting==========
width_set =int(input("请输入宽度"))
height_set = int(input("请输入高度"))
Ischeck = str(input("是否要查看生成过程(Y/N)"))
IsFind =str(input("是否要寻找路径(Y/N)"))
sys.setrecursionlimit(3000)
#=====test=======
if Ischeck !='Y' and Ischeck !='N':
    print("你输入的是:"+Ischeck)
    print("请重新输入Y/N")
    sys.exit()
if IsFind !='Y' and IsFind !='N':
    print("你输入的是:"+IsFind)
    print("请重新输入Y/N")
    sys.exit()
if width_set<4 or height_set<4:
    width_set=11
    height_set=11
    print("输入的尺寸过小,已自动调节成,宽度:11,高度:11")
if width_set%2 !=1:
    width_set +=1
    print("宽度请输入奇数,已自动矫正为:"+str(width_set))
if height_set%2 !=1:
    height_set +=1
    print("高度请输入奇数,已自动矫正为:"+str(height_set))

class cube:
    loc_x=0#当前的x坐标
    loc_y=0#当前的y坐标
    from_x = 0
    from_y = 0
    IsEndpoints = False
    IsWay = False
    Iswall = True#是否是墙
    Iscalled = False#是否被使用过

time_before = time.time()
map = [[0 for width in range(width_set)] for height in range(height_set)]

def initial():
    #初始化地图并记录自身的坐标
    for height in range(0,height_set):
        for width in range(width_set):
            map[height][width] = cube()
            map[height][width].loc_y = height
            map[height][width].loc_x = width

    #初始化起始点
    map[1][0].Iswall = False
    map[1][1].from_x = 0
    map[1][1].from_y = 1

    #=======================初始化边框=========================
    for height in range(0,height_set-1):
         for width in range(width_set-1):
            if(height == 0 or height == width_set-1):
                map[height][width].Iscalled = True
            else:
                map[height][0].Iscalled = True
                map[height][width_set-1].Iscalled = True

def printmap():
    out=""
    for height in range(height_set):
        for width in range(width_set):
            if map[height][width].Iswall ==True:
                out = out+"■ "
            elif map[height][width].IsWay ==True:
                out = out+". "
            elif map[height][width].IsEndpoints ==True:
                out = out+"* "
            else:
                out = out +"  "
                
            if width == width_set-1:
                out = out +"\n"
    print(out)

def spawn(local_map=[]):
    Waypoints_ing =[]#当函数运行时用来添加备选路点
    width = local_map.loc_x
    height = local_map.loc_y

    map[height][width].Iswall = False
    if width>2:#判断左边的格子
        if map[height][width-2].Iswall == True:
            Waypoints_ing.append(map[height][width-2])
            map[height][width-2].from_x = width
            map[height][width-2].from_y = height

    if height>2:#判断上边的格子
        if map[height-2][width].Iswall == True:
            Waypoints_ing.append(map[height-2][width])
            map[height-2][width].from_x = width
            map[height-2][width].from_y = height

    if width<width_set-2:#判断下边的格子
        if map[height][width+2].Iswall == True:
            Waypoints_ing.append(map[height][width+2])
            map[height][width+2].from_x = width
            map[height][width+2].from_y = height

    if height<height_set-2:#判断上边的格子
        if map[height+2][width].Iswall == True:
            Waypoints_ing.append(map[height+2][width])
            map[height+2][width].from_x = width
            map[height+2][width].from_y = height

    if(local_map.from_x !=0 and local_map.from_y!=0):
        map[int((local_map.from_y+height)/2)][int((local_map.from_x+width)/2)].Iswall = False
    if(len(Waypoints_ing)>0):#如果有元素
        if Ischeck == "Y":
            printmap()
        targetnum = random.randint(0,len(Waypoints_ing)-1)#生成一个关于Waypoints_ing的随机的下标
        spawn(Waypoints_ing[targetnum])#进行下一次的递归
    else:
        if map[height][width].from_y ==1 and map[height][width].from_x==0:#如果回溯的目标为初始点的时候
            return#从递归中跳出
        spawn(map[map[height][width].from_y][map[height][width].from_x])#如果不是初始点,那么就在回溯目标的格子上继续递归

def DoFindway(local_map = []):
    width = local_map.loc_x
    height = local_map.loc_y
    map[height][width].Iscalled = True
    if width>0:
        if map[height][width-1].IsEndpoints ==True:
            spawmWay(map[height][width])

        if map[height][width-1].Iswall == False and map[height][width-1].Iscalled == False:
            map[height][width-1].from_y = height
            map[height][width-1].from_x = width
            DoFindway(map[height][width-1])
           
    if height>0:
        if map[height-1][width].IsEndpoints  == True:
            spawmWay(map[height][width])

        if map[height-1][width].Iswall == False and map[height-1][width].Iscalled == False:
            map[height-1][width].from_y = height
            map[height-1][width].from_x = width
            DoFindway(map[height-1][width])
        

    if width<width_set-1:
        if map[height][width+1].IsEndpoints  == True:
            spawmWay(map[height][width])

        if map[height][width+1].Iswall == False and map[height][width+1].Iscalled == False:
            map[height][width+1].from_y = height
            map[height][width+1].from_x = width
            DoFindway(map[height][width+1])
           
    if height<height_set-1:
        if map[height+1][width].IsEndpoints  == True:
            spawmWay(map[height][width])

        if map[height+1][width].Iswall == False and map[height+1][width].Iscalled ==False:
            map[height+1][width].from_y = height
            map[height+1][width].from_x = width
            DoFindway(map[height+1][width])
        
#记录路径点
def spawmWay(local_map = []):
    width = local_map.loc_x
    height = local_map.loc_y
    map[height][width].IsWay = True
    '''
    print("跟踪:("+str(height)+","+str(width)+")")
    print("跟踪from:("+str(local_map.from_y)+","+str(local_map.from_x)+")")
    '''
    if local_map.from_x !=0 or local_map.from_y !=1:
        spawmWay(map[local_map.from_y][local_map.from_x])
    

def findWay():
    for height in range(1,height_set-1):
        for width in range(1,width_set-1):
            map[height][width].Iscalled = False
    print("寻找路径中")
    DoFindway(map[1][1])
    print("路径寻找完毕")
   
print(map)
initial()
spawn(map[1][1])
printmap()
if IsFind =="Y":
    map[1][1].IsWay = True
    map[height_set-2][width_set-1].IsEndpoints = True
    map[height_set-2][width_set-1].Iswall = False
    findWay()
printmap()

首先,根据以上的分析,我们需要对格子添加一些新的属性:是否是墙,是否被使用过,是否是终点
因此要在class类里添加三个属性

class cube:
    loc_x=0#当前的x坐标
    loc_y=0#当前的y坐标
    from_x = 0
    from_y = 0
    IsEndpoints = False#是否是终点
    IsWay = False
    Iswall = True#是否是墙
    Iscalled = False#是否被使用过

检测路的存在与否

首先是与之前的思路一样的:
以检测左边的格子是不是路为例:
如果,要保证检测左边的格子不会报错,那么就说明左边是有格子可以检测的,那么就可以推断出:当前的位置不在地图的最左侧,即:width>0
那么,我们要检测左边的格子的时候就要保证当前的格子不是最左边的格子,那么就需要一下的代码进行判断

if width>0:

好,现在已经说明了当前的格子不是最左边的格子了,那么我们就可以开始检测左边的格子是不是终点,如果是,那么就直接做路径的回溯:

if map[height][width-1].IsEndpoints ==True:
         spawmWay(map[height][width])#在接下来会讲到,这个函数是用来做路径的回溯的

如果不是终点,那么就要判断左边的格子是不是墙,如果是墙就直接跳过,如果不是墙,那么就要判断左边的路有没有被检测过(即是不是刚才的路,要避免死循环),如果没有被检测过,那么就在这个没被检测过的路上进行检测

if map[height][width-1].Iswall == False and map[height][width-1].Iscalled == False:
#将左边方块的回溯方块的坐标指向当前的方块,说明是从当前的方块传递到左边的方块的
       map[height][width-1].from_y = height
       map[height][width-1].from_x = width
       DoFindway(map[height][width-1])#这个方法就是现在在讲的方法,当前的代码会在最后封装成DoFindway()方法

其余三向的检测都是一个道理

if width>0:#检测左边的格子
        if map[height][width-1].IsEndpoints ==True:
            spawmWay(map[height][width])

        if map[height][width-1].Iswall == False and map[height][width-1].Iscalled == False:
            #将左边方块的回溯方块的坐标指向当前的方块,说明是从当前的方块传递到左边的方块的
            map[height][width-1].from_y = height
            map[height][width-1].from_x = width
            DoFindway(map[height][width-1])
           
    if height>0:#检测上面的格子
        if map[height-1][width].IsEndpoints  == True:
            spawmWay(map[height][width])

        if map[height-1][width].Iswall == False and map[height-1][width].Iscalled == False:
            map[height-1][width].from_y = height
            map[height-1][width].from_x = width
            DoFindway(map[height-1][width])
        

    if width<width_set-1:#检测右边的格子
        if map[height][width+1].IsEndpoints  == True:
            spawmWay(map[height][width])

        if map[height][width+1].Iswall == False and map[height][width+1].Iscalled == False:
            map[height][width+1].from_y = height
            map[height][width+1].from_x = width
            DoFindway(map[height][width+1])
           
    if height<height_set-1:#检测下面的格子
        if map[height+1][width].IsEndpoints  == True:
            spawmWay(map[height][width])

        if map[height+1][width].Iswall == False and map[height+1][width].Iscalled ==False:
            map[height+1][width].from_y = height
            map[height+1][width].from_x = width
            DoFindway(map[height+1][width])

接下来,我们要将这个代码封装起来
为了让我们写代码的时候比较方便,所以我将这个方法里的width设定为当前格子的x,height设置为当前格子的y

def DoFindway(local_map = []):
    width = local_map.loc_x
    height = local_map.loc_y

并且,每一次执行这个方法的时候都说明当前的格子已经被检测过了,因此,

  map[height][width].Iscalled = True

最后,这个方法就写完了

关于找到终点以后寻找回起点的问题

其实这个方法很简单:首先先将当前的方块设置为路径,再判断当前的方块的上一个方块是不是起点,如果不是,那就在上一个方块再次执行当前的方法.如果是,那么就停止当前的递归.

def spawmWay(local_map = []):#输入一个格子
    width = local_map.loc_x
    height = local_map.loc_y
    map[height][width].IsWay = True#将当前的方块设置为路径点
    '''
    print("跟踪:("+str(height)+","+str(width)+")")
    print("跟踪from:("+str(local_map.from_y)+","+str(local_map.from_x)+")")
    '''
    if local_map.from_x !=0 or local_map.from_y !=1:#(1,0)为初始点的坐标( 坐标的格式(y,x) )
        spawmWay(map[local_map.from_y][local_map.from_x])

最后,我们将这两个方法封装在一起,变成findway()方法
其中,为了防止程序报错,我们先将地图中所有的格子的Iscalled属性初始化,最后我们就有了这个方法

def findWay():
   
    for height in range(1,height_set-1):
        for width in range(1,width_set-1):
            map[height][width].Iscalled = False
    
    print("寻找路径中")
    DoFindway(map[1][1])
    print("路径寻找完毕")

对代码的修修补补

首先先将初始化地图的代码封装在initial()方法里,并添加对墙的初始化.

def initial():
    #初始化地图并记录自身的坐标
    for height in range(0,height_set):
        for width in range(width_set):
            map[height][width] = cube()
            map[height][width].loc_y = height
            map[height][width].loc_x = width

    #初始化起始点
    map[1][0].Iswall = False
    map[1][1].from_x = 0
    map[1][1].from_y = 1

    #=======================初始化边框=========================
    for height in range(0,height_set-1):
         for width in range(width_set-1):
            if(height == 0 or height == width_set-1):
                map[height][width].Iscalled = True
            else:
                map[height][0].Iscalled = True
                map[height][width_set-1].Iscalled = True


在这边,我还添加了两个选项,一个就是要不要生成路径;还有一个是要不要查看迷宫生成的过程
对于生成路径:
如果要生成路径,那么就先将坐标为(1,1)的点设置成路径(因为起点就紧挨着这个路),并且将终点的位置的墙设置成路,将旁边路的属性设置成”终点”

if IsFind =="Y":
    map[1][1].IsWay = True
    map[height_set-2][width_set-1].IsEndpoints = True
    map[height_set-2][width_set-1].Iswall = False
    findWay()

而对于生成迷宫创建的过程,即在每递归一次的时候添加

if Ischeck == "Y":
    printmap()

并且在代码开头添加这两个选项的输入

Ischeck = str(input("是否要查看生成过程(Y/N)"))
IsFind =str(input("是否要寻找路径(Y/N)"))
#=====test=======
if Ischeck !='Y' and Ischeck !='N':
    print("你输入的是:"+Ischeck)
    print("请重新输入Y/N")
    sys.exit()
if IsFind !='Y' and IsFind !='N':
    print("你输入的是:"+IsFind)
    print("请重新输入Y/N")
    sys.exit()

sys.exit()是程序退出的意思

这个结束后就是最后的printmap()方法的修改了,由于我们又添加了路径,又添加了终点,因此要添加对这两个属性的判断:

elif map[height][width].IsWay ==True:
    out = out+". "
elif map[height][width].IsEndpoints ==True:
    out = out+"* "

最后的样子则为:

def printmap():
    out=""
    for height in range(height_set):
        for width in range(width_set):
            if map[height][width].Iswall ==True:
                out = out+"■ "
            elif map[height][width].IsWay ==True:
                out = out+". "
            elif map[height][width].IsEndpoints ==True:
                out = out+"* "
            else:
                out = out +"  "
                
            if width == width_set-1:
                out = out +"\n"
    print(out)

本篇教程就到这里结束了,如果有什么不会的或者是什么可以改进的可以留言,我应该是会及时回复的

改进的那个算法的教程尽量不咕(

踢馆朋友圈迷宫挑战——自动寻路(Python实现) 背景 我打开手机,发现有人在QQ空间里叫嚣。 看他得意的样子,显然是在家里呆久了,已经忘了天有多高。 预处理 设计一个迷宫自动寻路算法并不难,但是对于当下这个任务而言,第一个棘手的地方在于,如何把这个迷宫变成计算机认识的样子,也就是迷宫图片的矩阵化。 图片的大小是397×390。先把四周的白边裁掉,再把这幅图中的每一个像素二值化,再根据颜色赋值,黑色用0表示,白色用1表示,建立一个0/1矩阵。考虑到迷宫的边界都是封闭的,为了防止由于图片质量问题导致某些看上去是0的地方其实是1,在之后走迷宫的过程中造成一些 阅读详情

相关推荐

【算法】(BFS/DFS)迷宫路径问题(C语言)

题目:现有一迷宫如下图所示,蓝色部分为墙壁,白色部分为通路,入口在左上角(1,1)处,出口在右下角(8,8)处,试找出一条路径以通过该迷宫(路径不能重叠)。

weixin_51450101的博客 8116

寻路算法--迷宫寻路

该篇文章接上篇并查集应用——生成随机迷宫, 此时已经可以生成一个任意大小的生成的迷宫        但是看起来还缺点什么,对,就是路径,没有路径怎么证明这真的是个迷宫,因此现学现用把路径加上。首先寻路算法属于图论算法,要想寻路先得有图,什么是图,这个就不细讲了,很多专门讲这个的文章,简单的说图就是一些点再加上连接这些点的边就构成了图,只要把迷宫抽象成图就能应用图论算法了。      .

keep moving 3818

10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 深度优先算法(DFS 算法)是什么? 寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径。主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点。如果走到某个节点发现无路可走,那么就会回退到上一个节点,重新选择其他路径。直到找到出口,或者退到起点再也无路可走,游戏结束。当然,...

python函数基础教程 2188

迷宫算法 之 迷宫生成和迷宫寻路

本文讲解迷宫生成和迷宫寻路算法。 //////////////////////////////////////////////////////////////////////////////////////////////////// 一、三种迷宫生成算法     1、 DFS(即深度优先)算法生成,分为递归和非递归方法。     2、 十字分割算法生成,分为递归和非递归方法。     3、随机 Prim 算法生成,一种非递归方法。 二、两种迷宫寻路算法     1、DFS 寻路,采用非...

Globalizationa的博客 5490

迷宫与寻路可视化(一)深度优先搜索构建迷宫(DFS算法)

效果展示 基本思想 函数详解 源码链接

Ace Cheney的博客 4309

Python迷宫寻路实战:DFS与BFS算法可视化实现

图搜索算法是计算机科学中解决路径规划、状态空间探索等问题的核心基础。深度优先搜索(DFS)和广度优先搜索(BFS)作为两种经典的图遍历策略,其原理分别基于栈的“后进先出”与队列的“先进先出”特性,体现了回溯与层次遍历的核心思想。掌握这些算法对于理解更复杂的A*寻路、游戏AI乃至网络爬虫都至关重要。在工程实践中,通过Python将算法应用于迷宫寻路这类具体场景,能直观对比DFS“一条路走到黑”与BFS“层层递进”的搜索差异,并理解BFS在等权图中寻找最短路径的保证。本项目利用Pygame库实现了算法的**可视

weixin_30660027的博客 383

基于深度优先算法的破解迷宫

文章目录前言一、Prim算法生成地图二、使用步骤1.引入库2.读入数据总结 前言 通过prim可以生成不同的地图,通过A*算法解决迷宫问题 一、Prim算法生成地图 这次引入了不同的包 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('igno

weixin_44120833的博客 818

Python实战案例:递归实现迷宫寻路

通过这个迷宫求解实例,我们看到了递归在解决实际问题时的强大能力。明确定义递归终止条件正确处理回溯合理标记访问状态递归虽然强大,但由于Python中递归其自身的限制,此案例仅用于演示递归的用法。在实际应用中,对于大型复杂迷宫,我们可能需要考虑使用其他算法(广度优先搜索(BFS)、A * 算法)。关注「安于欣」获取更多Python技巧。

an_yu_xin的博客 1446

随机迷宫生成及寻路

'''根据提供的行列随机生成一个迷宫。返回值为包含迷宫地图的三维数组rows,cols:生成的迷宫的行数及列数start_x,start_y 迷宫的起点坐标,默认为(0,0)返回:地图数组''''''创建一个三维数组,并把它们所有的数据置0。(rows,cols)表示单元格在数组中的行列第三维包含5个数,索引0:代表单元格中的左半墙,1:上半墙,2:右半墙,3:下半墙,4代表单元格里的路。'''cells = [(r,c)] #待追踪的单元格列表。#以(r,c)处作为出发地。

2401_87006911的博客 1410

Python实现迷宫寻路算法深度解析

在探索迷宫寻路算法的世界时,Python作为一种强大的编程语言,提供了灵活的工具和丰富的库,使得复杂的算法实现变得简单而有趣。迷宫寻路算法是计算机科学中的一个重要分支,它不仅可以应用于游戏设计,还可以广泛应用于机器人导航、网络通信以及路径规划等多个领域。深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。该算法沿着树的分支进行深入,直到找到所需的节点或达到分支的末端,然后回溯到上一个节点继续搜索。在迷宫寻路问题中,我们可以将迷宫视为一个图,其中的通道是节点之间的边,而墙壁则表示节点之间没有边相连。

weixin_42372837的博客 1609

Python深度优先搜索算法DFS的实现与应用

深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。这种算法将尝试沿着一条路径深入,直到到达一个没有后继节点的节点,然后回溯到上一个节点,寻找新的路径继续搜索。DFS可以用于解决许多类型的问题,如路径查找、连通性判断、拓扑排序等。在本章节中,我们介绍了Python语言中使用递归方法实现深度优先搜索(DFS)算法的基础知识,包括递归函数的工作机制和在DFS中的应用。通过具体的代码示例,我们分析了递归函数的编写步骤和递归深度的处理方法。

weixin_42499004的博客 1062

迷宫游戏python实现

在迷宫算法总结篇中我总结了生成迷宫的四种算法,在这一篇文章里面我侧重迷宫游戏的实现以及可视化。 首先我使用python3中的tkinter实现了一个简陋版的迷宫游戏,截图如下图所示,为了降低游戏的难度,在寻找路径的过程中你可以通过点击图中的空白点,生成从起点到你点击位置的暂时路径。迷宫的难度主要由以下几个参数决定: 迷宫的长和宽:尺寸越大,生成的地图越难 迷宫生成算法:难度:kruskal算法 ...

哆啦A瑶的博客 9180

西门子工业物联网云平台 Insights Hub 技术白皮书

Insights Hub是西门子公司推出的工业物联网云平台,它是一个使用开放技术的基于云架构的平台,能够为制造业企业提供物联网连接、数据分析、应用开发等一系列服务。Insights Hub的设计理念是“连接、分析和运营”,即通过连接物理设备、收集数据并进行分析,来优化工业生产的运营和管理。

可爱的刘三岁的博客 3336

软件实习项目3——基于A*算法的迷宫(代码实现)

软件实习项目3——基于A*算法的迷宫(代码实现)类变量的定义以及类的初始化__init__一、迷宫地图的生成1、初始化地图2、深度优先算法生成迷宫二、玩家走迷宫1、键盘事件2、玩家移动三、A*算法迷宫寻路1、A*寻路2、显示路径和移出脚印四、绘制游戏界面五、游戏开始与结束界面 类变量的定义以及类的初始化__init__ class MazeMap(QWidget): # 类变量 # 记录已访问的迷宫通路单元的坐标 checked_x = 3 checked_y = 3

Mirrracle的博客 1086

习题6-3 使用函数输出指定范围内的完数

其中函数factorsum须返回int number的因子和;函数PrintPN要逐行输出给定范围[mn]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。

cutto的博客 864

FreeSWITCH编译安装详细文档

本文档详细介绍了在Ubuntu 22.04系统上从源码编译安装FreeSWITCH的完整流程。主要内容包括:1)系统环境准备和依赖库安装;2)关键依赖库spandsp和sofia-sip的编译安装;3)FreeSWITCH源码的特定版本(v1.6.0)编译配置,包括禁用SignalWire模块的配置方法;4)系统服务配置,包括创建专用用户、设置权限以及配置systemd服务文件。文档特别提供了版本控制说明,确保后期能切换到相同的版本环境,并附有详细的命令操作步骤和注意事项。

唯有代码让我痴狂 1370

C++实现DFS迷宫寻路算法:从原理到游戏开发实践

自动寻路是游戏开发中的核心功能,尤其在RPG、策略和迷宫类游戏中,它决定了角色或单位的智能移动能力。其基本原理是通过算法在给定的地图空间内,寻找从起点到终点的一条可行路径。深度优先搜索(DFS)作为一种经典的图遍历算法,通过“尝试-深入-回溯”的策略,系统地探索所有可能的路径,为解决路径存在性问题提供了清晰的思路。在工程实践上,DFS虽然不保证找到最短路径,但其实现简单、逻辑直观,非常适合用于快速原型开发、地图探索逻辑验证以及算法教学。在游戏开发的具体场景中,DFS常被应用于战争迷雾的揭开、解谜游戏的路径可

weixin_30613433的博客 419

Versal ACAP NoC实战:像理解计算机网络一样配置AXI NoC,打通PS与PL数据通路

本文深入探讨了Versal ACAP NoC的配置与优化,通过计算机网络类比解析NoC架构,详细介绍了在VD100开发板上配置AXI NoC实现PS与PL数据交互的实战步骤。文章涵盖NoC组件功能、Vivado配置技巧、性能优化方法及常见问题解决方案,帮助开发者高效打通Versal芯片的数据通路。

weixin_42665255的博客 294

python迷宫代码深度优先_动画演示深度优先算法搜寻逃出迷宫的路径

深度优先算法(DFS 算法)是什么?寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径。主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点。如果走到某个节点发现无路可走,那么就会回退到上一个节点,重新选择其他路径。直到找到出口,或者退到起点再也无路可走,游戏结束。当然,深度优先算法,只要查找到一条行得通的路径,就会停止搜索;也就是说只要有路...

weixin_39668199的博客 121

搞定8GB/s数据流:一个FPGA工程师的XDMA驱动调优实战(附避坑清单)

本文详细记录了FPGA工程师在XDMA驱动调优过程中实现8GB/s高带宽数据流的实战经验。通过优化DDR访问、中断响应、DMA映射等关键环节,解决了PCIE数据采集卡在高带宽场景下的性能瓶颈,并提供了实用的避坑清单和技术方案。

weixin_29194255的博客 204

华为OD新系统机试真题 - 获取大写字母瓷砖拼出独特图案数量

华为OD机试新系统真题【获取大写字母瓷砖拼出独特图案数量】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统四月二十九号机试真题【获取大写字母瓷砖拼出独特图案数量】

qq_45776114的博客 1219

python可视化迷宫求解_荐迷宫与寻路可视化(一)深度优先搜索构建迷宫(DFS算法)...

效果展示基本思想不论是DFS,BFS还是RFS,这些算法生成的迷宫本质上是一个二维矩阵网络形式的生成树,也就是说其中没有回路,同时从右上角的起点到迷宫中的每一点都有且仅有一条路径,当然,到终点的路径也是唯一的。深度优先遍历总是从当前最长的路径的末端随机选择一个可扩展点进行扩展,如果出现回路或者抵达边界,那么就回溯到最近的一个可扩展分枝。这种算法生成的迷路分枝相对较少,路径也更长更曲折。函数详解一、...

weixin_42501919的博客 1390

网工、运维利器:MobaXterm,一款全能的远程工具

你好,这里是网络技术联盟站,我是瑞哥。是一款由Mobatek开发的多功能远程计算机管理工具,集成了多种网络协议和工具,专为网络工程师和系统管理员设计。它提供了丰富的远程连接功能,包括SSH、RDP、VNC、X11转发等,支持文件传输和多标签界面,内置了文本编辑器和多种网络工具,是一款全能的远程管理软件。MobaXterm的开发起始于2008年,最初只是一个简单的X服务器,但随着用户需求的不断增加和软件的逐步完善,MobaXterm逐渐发展成了一款功能全面、界面友好的远程管理工具。

网络技术联盟站 5230

python迷宫代码深度优先_10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径...

深度优先算法(DFS 算法)是什么?寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径。主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点。如果走到某个节点发现无路可走,那么就会回退到上一个节点,重新选择其他路径。直到找到出口,或者退到起点再也无路可走,游戏结束。当然,深度优先算法,只要查找到一条行得通的路径,就会停止搜索;也就是说只要有路...

weixin_39731271的博客 263

YOLOv8改进 | 注意力篇 | YOLOv8引入EMAttention(EMA)注意力

具体来说,除了对全局信息进行编码以重新校准每个并行分支中的通道权重之外,还通过跨维度交互来进一步聚合两个并行分支的输出特征,以捕获像素级的成对关系。3. 跨空间学习:除了在每个并行子网络中建立局部的跨通道交互外,EMA模块还通过跨空间学习方法融合了两个并行子网络的输出特征图。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv8改进有效涨点专栏,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 896

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关键路径算法python_用Python动画演示深度优先算法搜寻逃出迷宫的路径

深度优先算法(DFS 算法)是什么?寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径。主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点。如果走到某个节点发现无路可走,那么就会回退到上一个节点,重新选择其他路径。直到找到出口,或者退到起点再也无路可走,游戏结束。当然,深度优先算法,只要查找到一条行得通的路径,就会停止搜索;也就是说只要有路...

weixin_39754142的博客 124

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: 迷宫生成算法---深度优先算法(基于python)
下一篇: C++11 标准库allocator类construct成员函数的用法
ghost_him
博客等级 码龄6年 598粉丝 90原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值