题目:给一个二维列表,表示迷宫(0表示通道,1表示围墙)。给出算法,求一条走出迷宫的路径。

maze = [[1,1,1,1,1,1,1,1,1,1],[1,0,0,1,0,0,0,1,0,1],[1,0,0,1,0,0,0,1,0,1],[1,0,0,0,0,1,1,0,0,1],[1,0,1,1,1,0,0,0,0,1],[1,0,0,0,1,0,0,0,0,1],[1,0,1,0,0,0,1,0,0,1],[1,0,1,1,1,0,1,1,0,1],[1,1,0,0,0,0,0,0,0,1],[1,1,1,1,1,1,1,1,1,1]]

解决思路:

  • 在一个迷宫节点(x,y)上,可以进行四个方向的探查:maze[x-1][y], maze[x+1][y], maze[x][y-1], maze[x][y+1]
  • 思路:从一个节点开始,任意找下一个能走的点,当找不到能走的点时,退回上一个点寻找是否有其他方向的点。
  • 方法:创建一个空栈,首先将入口位置进栈。当栈不空时循环:获取栈顶元素,寻找下一个可走的相邻方块,如果找不到可走的相邻方块,说明当前位置是死胡同,进行回溯(就是讲当前位置出栈,看前面的点是否还有别的出路)

用栈实现:

maze = [[1,1,1,1,1,1,1,1,1,1],[1,0,0,1,0,0,0,1,0,1],[1,0,0,1,0,0,0,1,0,1],[1,0,0,0,0,1,1,0,0,1],[1,0,1,1,1,0,0,0,0,1],[1,0,0,0,1,0,0,0,0,1],[1,0,1,0,0,0,1,0,0,1],[1,0,1,1,1,0,1,1,0,1],[1,1,0,0,0,0,0,0,0,1],[1,1,1,1,1,1,1,1,1,1]
]dirs = [lambda x,y:(x-1,y),  #上lambda x,y:(x,y+1),  #右lambda x,y:(x+1,y),  #下lambda x,y:(x,y-1),  #左
]def solve_maze(x1, y1, x2, y2):stack = []stack.append((x1,y1))maze[x1][y1] = 2while len(stack) > 0:   # 当栈不空循环cur_node = stack[-1]if cur_node == (x2,y2): #到达终点for p in stack:print(p)return Truefor dir in dirs:next_node = dir(*cur_node)if maze[next_node[0]][next_node[1]] == 0:   #找到一个能走的方向
                stack.append(next_node)maze[next_node[0]][next_node[1]] = 2  # 2表示已经走过的点breakelse: #如果一个方向也找不到
            stack.pop()else:print("无路可走")return False

用队列实现:

解决思路:

  • 思路:从一个节点开始,寻找所有下面能继续走的点。继续寻找,直到找到出口。
  • 方法:创建一个空队列,将起点位置进队。在队列不为空时循环:出队一次。如果当前位置为出口,则结束算法;否则找出当前方块的4个相邻方块中可走的方块,全部进队。

from collections import dequemaze = [[1,1,1,1,1,1,1,1,1,1],[1,0,0,1,0,0,0,1,0,1],[1,0,0,1,0,0,0,1,0,1],[1,0,0,0,0,1,1,0,0,1],[1,0,1,1,1,0,0,0,0,1],[1,0,0,0,1,0,0,0,0,1],[1,0,1,0,0,0,1,0,0,1],[1,0,1,1,1,0,1,1,0,1],[1,1,0,0,0,0,0,0,0,1],[1,1,1,1,1,1,1,1,1,1]
]def solve_maze2(x1,y1,x2,y2):queue = deque()path = []    # 记录出队之后的节点queue.append((x1,y1,-1))maze[x1][y1] = 2while len(queue) > 0:cur_node = queue.popleft()path.append(cur_node)if cur_node[0] == x2 and cur_node[1] == y2:  #到终点real_path = []x,y,i = path[-1]real_path.append((x,y))while i >= 0:node = path[i]real_path.append(node[0:2])i = node[2]real_path.reverse()for p in real_path:print(p)return Truefor dir in dirs:next_node = dir(cur_node[0], cur_node[1])if maze[next_node[0]][next_node[1]] == 0:queue.append((next_node[0], next_node[1], len(path)-1))maze[next_node[0]][next_node[1]] = 2 # 标记为已经走过else:print("无路可走")return Falsesolve_maze2(1,1,8,8)

转载于:https://www.cnblogs.com/TheLand/p/9250679.html

算法----迷宫问题相关推荐

  1. a*算法迷宫 c++_算法竞赛专题解析(12):搜索基础

    搜索 搜索,就是查找解空间,它是"暴力法"算法思想的具体实现. 文章目录: 01 搜索简介 02 搜索算法的基本思路 03 BFS的性质和代码实现 04 DFS的常见操作和代码实现 ...

  2. 数据结构与算法 迷宫问题

    迷宫问题问题描述: 栈的实现在这篇博客中:https://blog.csdn.net/zj1131190425/article/details/87991662 迷宫是一个矩形区域,有一个出口和入口, ...

  3. 数据结构与算法——迷宫问题

    课程名称:数据结构与算法 设计题目:迷宫问题 已知技术参数和设计要求: 问题描述: 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.迷宫问题要求求出从入口(1,1)到出口(m,n)的一 ...

  4. MATLAB | prim算法迷宫生成及其艺术渲染

    最近比较忙更新频率也慢了下来,今天带来一个比较有趣的可视化,基于prim算法的迷宫生成并用距离生成图片: 我通过各种向量化编程编写了一个迷宫生成函数,由于代码不是很短因此放在最后面展示代码,以下展示如 ...

  5. 人工智能大作业——A*算法迷宫寻路问题

    项目设计的目的 利用A*算法实现迷宫寻路功能,利用启发式函数的编写以及各类启发式函数效果的比较. 相关原理知识介绍 A*(A-Star)算法是一种静态路网中求解最短路最有效的方法.公式表示为:f(n) ...

  6. 算法迷宫 深度优先算法

    1.1关于随机迷宫生成的问题 随机迷宫生成是算法中一个典型的例子,生成一个庞大且复杂的迷宫,人们进去以后很难走出来.一般来说,利用二维数组存储一个矩形迷宫,利用广度优先算法.深度优先算法.以及随机普里 ...

  7. 寻路算法--迷宫寻路

    该篇文章接上篇并查集应用--生成随机迷宫, 此时已经可以生成一个任意大小随机的迷宫        但是看起来还缺点什么,对,就是路径,没有路径怎么证明这真的是个迷宫,因此现学现用把路径加上.首先寻路算 ...

  8. 数据结构与算法 迷宫夺宝 C语言

    迷宫夺宝 1.1 题目要求 一个N x N的矩阵代表了一个迷宫,迷宫中每个房间由以下三种数字的一种来表示:     0 代表房间安全,是可以通过的.     1 代表房间中有奖励物品,玩家可以拿到奖励 ...

  9. C#三大迷宫生成算法

    今天介绍一下很经典的三大迷宫算法的C#实现,即随机普利姆算法,深度优先算法和十字分割(也就是递归分割算法).实现参考了[ActionScript 3] 三大迷宫生成算法一文(生成的迷宫预览图也使用的该 ...

最新文章

  1. 图像卷积下非极大值抑制 Sobel 的实现
  2. VS2010 连接SQLSERVER数据库步骤
  3. tkinter 菜单添加事件_tkinter学习教程(七)
  4. flask中的信号机制
  5. 洛谷 - P4001 [ICPC-Beijing 2006]狼抓兔子(网格图最大流转换为对偶图最短路)
  6. [译]模型-视图-提供器 模式
  7. python小波分解与重构_小波分解和重构
  8. raspberry中配置机器学习的环境
  9. 大厂程序员年薪_年薪25万一线大厂程序员,年薪10万三线城市大专讲师,怎么选...
  10. AI前导课-第一课AI概览(2018/10/20)
  11. 疫情期间天天对你“开枪”的额温枪,你知道它的工作原理吗?| 原力计划
  12. 拿什么重建你,巴黎圣母院?
  13. OpenCV学习(17) 细化算法(5)
  14. thinkphp漏洞_【组件攻击链】ThinkCMF 高危漏洞分析与利用
  15. python的文件操作os_​Python:目录和文件的操作模块os.path
  16. linux 常用命令 -- 系统管理工具包: 监视邮件的使用情况
  17. 根据国家统计局处理四级地址库
  18. K倍交叉验证配对t检验
  19. IB书单推荐:没有所谓的“闲书”
  20. 51单片机系列--闪烁灯,呼吸灯与流水灯

热门文章

  1. jfinal项目tomcat下部署
  2. 光影之路 GPU架构发展史(3/4)
  3. 通过机房工作看软工之软工总结
  4. 悄悄告诉你,在硅谷,有一种工作比程序员挣得多
  5. 现在,TensorRT 4开放下载了
  6. groupadd 命令
  7. SlidingMenu 源码分析
  8. 精伦盒子H1,插上USB,找不到对应的文件路径
  9. Nginx屏蔽个别User-Agent蜘蛛访问网站的方法
  10. 关于在事件代码中如何访问类中的变量