返回顶部
首页 > 资讯 > 后端开发 > Python >如何使用python求解迷宫问题
  • 397
分享到

如何使用python求解迷宫问题

2023-06-29 13:06:02 397人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“如何使用python求解迷宫问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用Python求解迷宫问题”文章能帮助大家解决问题。前言在迷宫问题中,给定入口和出口,要求找到路

这篇文章主要介绍“如何使用python求解迷宫问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用Python求解迷宫问题”文章能帮助大家解决问题。

前言

在迷宫问题中,给定入口和出口,要求找到路径。本文将讨论三种求解方法,递归求解、回溯求解和队列求解。

在介绍具体算法之前,先考虑将迷宫数字化。这里将迷宫用一个二维的list存储(即list嵌套在list里),将不可到达的位置用1表示,可到达的位置用0表示,并将已经到过的位置用2表示。

如何使用python求解迷宫问题

递归求解

递归求解的基本思路是:

  • 每个时刻总有一个当前位置,开始时这个位置是迷宫人口。

  • 如果当前位置就是出口,问题已解决。

  • 否则,如果从当前位置己无路可走,当前的探查失败,回退一步。

  • 取一个可行相邻位置用同样方式探查,如果从那里可以找到通往出口的路径,那么从当前位置到出口的路径也就找到了。

在整个计算开始时,把迷宫的人口(序对)作为检查的当前位置,算法过程就是:

  • mark当前位置。

  • 检查当前位置是否为出口,如果是则成功结束。

  • 逐个检查当前位置的四邻是否可以通达出口(递归调用自身)。

  • 如果对四邻的探索都失败,报告失败。

dirs=[(0,1),(1,0),(0,-1),(-1,0)] #当前位置四个方向的偏移量path=[]              #存找到的路径 def mark(maze,pos):  #给迷宫maze的位置pos标"2"表示“倒过了”    maze[pos[0]][pos[1]]=2 def passable(maze,pos): #检查迷宫maze的位置pos是否可通行    return maze[pos[0]][pos[1]]==0 def find_path(maze,pos,end):    mark(maze,pos)    if pos==end:        print(pos,end=" ")  #已到达出口,输出这个位置。成功结束        path.append(pos)        return True    for i in range(4):      #否则按四个方向顺序检查        nextp=pos[0]+dirs[i][0],pos[1]+dirs[i][1]        #考虑下一个可能方向        if passable(maze,nextp):        #不可行的相邻位置不管            if find_path(maze,nextp,end):#如果从nextp可达出口,输出这个位置,成功结束                print(pos,end=" ")                path.append(pos)                return True    return False def see_path(maze,path):     #使寻找到的路径可视化    for i,p in enumerate(path):        if i==0:            maze[p[0]][p[1]] ="E"        elif i==len(path)-1:            maze[p[0]][p[1]]="S"        else:            maze[p[0]][p[1]] =3    print("\n")    for r in maze:        for c in r:            if c==3:                print('\033[0;31m'+"*"+" "+'\033[0m',end="")            elif c=="S" or c=="E":                print('\033[0;34m'+c+" " + '\033[0m', end="")            elif c==2:                print('\033[0;32m'+"#"+" "+'\033[0m',end="")            elif c==1:                print('\033[0;;40m'+" "*2+'\033[0m',end="")            else:                print(" "*2,end="")        print() if __name__ == '__main__':    maze=[[1,1,1,1,1,1,1,1,1,1,1,1,1,1],\          [1,0,0,0,1,1,0,0,0,1,0,0,0,1],\          [1,0,1,0,0,0,0,1,0,1,0,1,0,1],\          [1,0,1,0,1,1,1,1,0,1,0,1,0,1],\          [1,0,1,0,0,0,0,0,0,1,1,1,0,1],\          [1,0,1,1,1,1,1,1,1,1,0,0,0,1],\          [1,0,1,0,0,0,0,0,0,0,0,1,0,1],\          [1,0,0,0,1,1,1,0,1,0,1,1,0,1],\          [1,0,1,0,1,0,1,0,1,0,1,0,0,1],\          [1,0,1,0,1,0,1,0,1,1,1,1,0,1],\          [1,0,1,0,0,0,1,0,0,1,0,0,0,1],\          [1,1,1,1,1,1,1,1,1,1,1,1,1,1]]    start=(1,1)    end=(10,12)    find_path(maze,start,end)    see_path(maze,path)

代码中see_path函数可以在控制台直观打印出找到的路径,打印结果如下:

如何使用python求解迷宫问题

S是入口位置 ,E是出口位置,*代表找到的路径,#代表探索过的路径。

回溯求解

在回溯解法中,主要是用栈来存储可以探索的位置。利用栈后进先出的特点,在一条分路上探索失败时,回到最近一次存储的可探索位置。这是一种深度优先搜索的方法。

def maze_solver(maze,start,end):    if start==end:        print(start)        return    st=SStack()    mark(maze,start)    st.push((start,0))             #入口和方向0的序对入栈    while not st.is_empty():      #走不通时回退        pos,nxt=st.pop()           #取栈顶及其检查方向        for i in range(nxt,4):     #依次检查未检查方向,算出下一位置            nextp = pos[0] + dirs[i][0], pos[1] + dirs[i][1]            if nextp==end:                print_path(end,pos,st)  #到达出口,打印位置                return            if passable(maze,nextp):    #遇到未探索的新位置                st.push((pos,i+1))      #原位置和下一方向入栈                mark(maze,nextp)                st.push((nextp,0))      #新位置入栈                break                   #退出内层循环,下次迭代将以新栈顶作为当前位置继续    print("找不到路径")

队列求解

队列求解算法中,以队列存储可以探索的位置。利用队列先进先出的特点,实现在每个分支上同时进行搜索路径,直到找到出口。这是一种广度优先搜索的方法。

def maze_solver_queue(maze,start,end):   path.append(start)   if start==end:       print("找到路径")       return   qu=SQueue()   mark(maze,start)   qu.enqueue(start)                #start位置入队   while not qu.is_empty():        #还有候选位置       pos=qu.dequeue()             #取出下一位置       for i in range(4):           #检查每个方向           nextp = pos[0] + dirs[i][0], pos[1] + dirs[i][1]           if passable(maze,nextp): #找到新的探索方向               if nextp==end:       #是出口,成功                   print("找到路径")                   path.append(end)                   return               mark(maze,nextp)               qu.enqueue(nextp)    #新位置入队               path.append(nextp)    print("未找到路径")

但队列求解方法,不能直接得出找到的具体路径,要得到找到的路径还需要其他存储结构(如链表)。

关于“如何使用python求解迷宫问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网Python频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: 如何使用python求解迷宫问题

本文链接: https://lsjlt.com/news/325010.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用python求解迷宫问题
    这篇文章主要介绍“如何使用python求解迷宫问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用python求解迷宫问题”文章能帮助大家解决问题。前言在迷宫问题中,给定入口和出口,要求找到路...
    99+
    2023-06-29
  • 使用python求解迷宫问题的三种实现方法
    目录前言递归求解回溯求解队列求解总结前言 在迷宫问题中,给定入口和出口,要求找到路径。本文将讨论三种求解方法,递归求解、回溯求解和队列求解。 在介绍具体算法之前,先考虑将迷宫数字化。...
    99+
    2024-04-02
  • C语言怎么求解迷宫问题
    这篇文章主要介绍“C语言怎么求解迷宫问题”,在日常操作中,相信很多人在C语言怎么求解迷宫问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么求解迷宫问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-17
  • 如何使用Python实现多路径迷宫
    小编给大家分享一下如何使用Python实现多路径迷宫,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python的数据类型有哪些python的数据类型:1. 数字类...
    99+
    2023-06-14
  • python迷宫问题深度优先遍历实例
    一、迷宫介绍 用python解迷宫问题,迷宫是一个二维列表,本次用深度优先解开迷宫问题。定义起点和终点,从一个位置到下一个位置只能通过向上或下或左或右,走一步来实现,从起点出发,如...
    99+
    2024-04-02
  • 星辰秘典:解开Python项目的神秘面纱——迷宫之星(迷宫探索与求解)
    ✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(html css js) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:你好,欢迎来到我的...
    99+
    2023-09-13
    pygame python 开发语言 迷宫搜索 深度搜索
  • 详解如何利用Python绘制迷宫小游戏
    目录构思绘制迷宫走出迷宫完整代码更大的挑战关于坐标系设置周末在家,儿子闹着要玩游戏,让玩吧,不利于健康,不让玩吧,扛不住他折腾,于是想,不如一起搞个小游戏玩玩! 之前给他编过猜数字 ...
    99+
    2024-04-02
  • Python如何实现迷宫生成器
    这篇文章主要介绍了Python如何实现迷宫生成器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python如何实现迷宫生成器文章都会有所收获,下面我们一起来看看吧。首先展示一下效果图:我们先分析一下所需的库:既...
    99+
    2023-07-02
  • 如何用Python进行编程迷宫大阵
    如何用Python进行编程迷宫大阵,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前言由外国人编写的freegames是一个免费的开源游戏集合,这个很方便了我们的开发简单的游戏,...
    99+
    2023-06-02
  • 详解Java利用深度优先遍历解决迷宫问题
    目录什么是深度优先一个简单的例子程序实现什么是深度优先 什么是深度,即向下,深度优先,即向下优先,一口气走到底,走到底发现没路再往回走。 在算法实现上来讲,深度优先可以考虑是递归的代...
    99+
    2024-04-02
  • 怎么用Java深度优先遍历解决迷宫问题
    本文小编为大家详细介绍“怎么用Java深度优先遍历解决迷宫问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Java深度优先遍历解决迷宫问题”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是深度优先什么...
    99+
    2023-06-29
  • Python如何实现过迷宫小游戏
    小编给大家分享一下Python如何实现过迷宫小游戏,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!开发工具Python版本: 3.6.4相关模块:pygame模块;以及一些Python自带的模块。环境搭建安装Python并添...
    99+
    2023-06-22
  • Java数据结构BFS广搜法解决迷宫问题
    目录1.例题题目描述输入输出测试数据 2. 思路分析基本思想具体步骤代码实现3.BFS小结求解思路:注意1.例题 题目描述 迷宫由 n 行 m 列的单元格组成,每个单元格要么是空地,...
    99+
    2024-04-02
  • 如何破解算法设计的迷宫?
    ...
    99+
    2024-04-02
    迷宫算法 效率复杂度 迷宫复杂度 实现错误 算法优化
  • 使用OpenCV实现迷宫解密的全过程
    目录一、你能自己走出迷宫吗?二、使用OpenCV找出出口。1、对图像进行二值化处理。2、 对二值化后的图像进行轮廓检测并标注3、对图像阈值进行处理。4、对图像进行扩展操作。...
    99+
    2024-04-02
  • 如何利用JAVA实现走迷宫程序
    本Demo使用三个类 一个Test类 一个自定义的Stack类 一个自定义的Queue类 可以实现的功能: 1.对于一个写在文本文件中的迷宫,能够将其转换为二维数组用广度优先搜索实现...
    99+
    2024-04-02
  • 如何使用数据结构写个Html5走迷宫游戏
    这篇文章主要为大家展示了“如何使用数据结构写个Html5走迷宫游戏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用数据结构写个Html5走迷宫游戏”这篇文...
    99+
    2024-04-02
  • 如何使用AngularJS跨站请求解决jsonp请求问题
    这篇文章将为大家详细讲解有关如何使用AngularJS跨站请求解决jsonp请求问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。这是我的请求:我在浏览器模板赋值的时候发...
    99+
    2024-04-02
  • Java分别利用深度优先和广度优先求解迷宫路径
    目录深度优先实现效果示例代码广度优先实现效果示例代码知识点总结深度优先 实现效果 示例代码 import java.awt.*; import javax.swing.*; p...
    99+
    2024-04-02
  • Java通过递归算法解决迷宫与汉诺塔及八皇后问题
    目录1.递归的重要规则2.递归的三个案例1.老鼠出迷宫2.汉诺塔3.八皇后1.递归的重要规则 在执行一个方法时,就创建一个新的受保护的独立空间(栈空间)。方法的局部变量时独立的,不会...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作