算法----迷宫问题
题目:给一个二维列表,表示迷宫(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
算法----迷宫问题相关推荐
- a*算法迷宫 c++_算法竞赛专题解析(12):搜索基础
搜索 搜索,就是查找解空间,它是"暴力法"算法思想的具体实现. 文章目录: 01 搜索简介 02 搜索算法的基本思路 03 BFS的性质和代码实现 04 DFS的常见操作和代码实现 ...
- 数据结构与算法 迷宫问题
迷宫问题问题描述: 栈的实现在这篇博客中:https://blog.csdn.net/zj1131190425/article/details/87991662 迷宫是一个矩形区域,有一个出口和入口, ...
- 数据结构与算法——迷宫问题
课程名称:数据结构与算法 设计题目:迷宫问题 已知技术参数和设计要求: 问题描述: 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.迷宫问题要求求出从入口(1,1)到出口(m,n)的一 ...
- MATLAB | prim算法迷宫生成及其艺术渲染
最近比较忙更新频率也慢了下来,今天带来一个比较有趣的可视化,基于prim算法的迷宫生成并用距离生成图片: 我通过各种向量化编程编写了一个迷宫生成函数,由于代码不是很短因此放在最后面展示代码,以下展示如 ...
- 人工智能大作业——A*算法迷宫寻路问题
项目设计的目的 利用A*算法实现迷宫寻路功能,利用启发式函数的编写以及各类启发式函数效果的比较. 相关原理知识介绍 A*(A-Star)算法是一种静态路网中求解最短路最有效的方法.公式表示为:f(n) ...
- 算法迷宫 深度优先算法
1.1关于随机迷宫生成的问题 随机迷宫生成是算法中一个典型的例子,生成一个庞大且复杂的迷宫,人们进去以后很难走出来.一般来说,利用二维数组存储一个矩形迷宫,利用广度优先算法.深度优先算法.以及随机普里 ...
- 寻路算法--迷宫寻路
该篇文章接上篇并查集应用--生成随机迷宫, 此时已经可以生成一个任意大小随机的迷宫 但是看起来还缺点什么,对,就是路径,没有路径怎么证明这真的是个迷宫,因此现学现用把路径加上.首先寻路算 ...
- 数据结构与算法 迷宫夺宝 C语言
迷宫夺宝 1.1 题目要求 一个N x N的矩阵代表了一个迷宫,迷宫中每个房间由以下三种数字的一种来表示: 0 代表房间安全,是可以通过的. 1 代表房间中有奖励物品,玩家可以拿到奖励 ...
- C#三大迷宫生成算法
今天介绍一下很经典的三大迷宫算法的C#实现,即随机普利姆算法,深度优先算法和十字分割(也就是递归分割算法).实现参考了[ActionScript 3] 三大迷宫生成算法一文(生成的迷宫预览图也使用的该 ...
最新文章
- 图像卷积下非极大值抑制 Sobel 的实现
- VS2010 连接SQLSERVER数据库步骤
- tkinter 菜单添加事件_tkinter学习教程(七)
- flask中的信号机制
- 洛谷 - P4001 [ICPC-Beijing 2006]狼抓兔子(网格图最大流转换为对偶图最短路)
- [译]模型-视图-提供器 模式
- python小波分解与重构_小波分解和重构
- raspberry中配置机器学习的环境
- 大厂程序员年薪_年薪25万一线大厂程序员,年薪10万三线城市大专讲师,怎么选...
- AI前导课-第一课AI概览(2018/10/20)
- 疫情期间天天对你“开枪”的额温枪,你知道它的工作原理吗?| 原力计划
- 拿什么重建你,巴黎圣母院?
- OpenCV学习(17) 细化算法(5)
- thinkphp漏洞_【组件攻击链】ThinkCMF 高危漏洞分析与利用
- python的文件操作os_​Python:目录和文件的操作模块os.path
- linux 常用命令 -- 系统管理工具包: 监视邮件的使用情况
- 根据国家统计局处理四级地址库
- K倍交叉验证配对t检验
- IB书单推荐:没有所谓的“闲书”
- 51单片机系列--闪烁灯,呼吸灯与流水灯