关于迷宫问题,常见会问能不能到达某点,以及打印到达的最短路径。可以用回溯法+递归来解决

代码一:dfs + 回溯

将矩阵外围以及路障统一设置为-1

设置current_step和next_step两个值。如果面临的点大于next_step,或者从未走过,就可以对它递归

存储矩阵:直接在原迷宫上修改,每个点标记的是从起点过来经过的步数,遇到0或者是比当前大至少2的,就考察

# -*- coding:utf-8 -*-

def init():

global graph

graph.append([-1, -1, -1, -1, -1, -1, -1])

graph.append([-1, 0, 0, -1, 0, 0, -1])

graph.append([-1, 0, -1, 0, 0, 0, -1])

graph.append([-1, 0, -1, 0, -1, -1, -1])

graph.append([-1, 0, -1, 0, 0, 0, -1])

graph.append([-1, 0, 0, 0, -1, 0, -1])

graph.append([-1, 0, 0, 0, 0, 0, -1])

graph.append([-1, -1, -1, -1, -1, -1, -1])

#深度优先遍历

def deepFirstSearch( steps , x, y ):

global graph

current_step = steps + 1

print(x, y, current_step )

graph[x][y] = current_step

next_step = current_step + 1

'''

遍历周围4个点:

如果周围节点不是-1 说明 不是障碍 在此基础上:

里面是0 说明没遍历过 我们把它修改成当前所在位置步数加1

里面比当前的next_step大 说明不是最优方案 就修改它

里面比当前next_step说明当前不是最优方案,不修改

'''

if not(x-1== 1 and y==1) and graph[x-1][y] != -1 and ( graph[x-1][y]>next_step or graph[x-1][y] ==0 ) : #上

deepFirstSearch(current_step, x-1 , y )

if not(x == 1 and y-1==1) and graph[x][y-1] != -1 and ( graph[x][y-1]>next_step or graph[x][y-1] ==0 ) : #左

deepFirstSearch(current_step, x , y-1 )

if not(x == 1 and y+1==1) and graph[x][y+1] != -1 and ( graph[x][y+1]>next_step or graph[x][y+1]==0 ) : #右

deepFirstSearch(current_step, x , y+1 )

if not(x+1== 1 and y==1) and graph[x+1][y] != -1 and ( graph[x+1][y]>next_step or graph[x+1][y]==0 ) : #下

deepFirstSearch(current_step, x+1 , y )

if __name__ == "__main__":

graph = []

init()

deepFirstSearch(-1,1,1)

print(graph[1][5])

代码二:也是回溯

这里0是可走,1是路障,用while来做循环。如果某点的附近有判断可走的新点,就将新点append进stack,走过了标记为-1;如果四个方向都没有,就从旧点从stack中pop掉,标上-1,进行回溯。

存储矩阵:stack中存储的0是可走,1是路障,-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,1,0,1],

[1,1,1,1,1,1,1,1,1,1]

]

dirs = [lambda x, y: (x + 1, y),

lambda x, y: (x - 1, y),

lambda x, y: (x, y - 1),

lambda x, y: (x, y + 1)]

def mpath(x1, y1, x2, y2):

stack = []

stack.append((x1, y1))

while len(stack) > 0:

curNode = stack[-1]

if curNode[0] == x2 and curNode[1] == y2:

#到达终点

for p in stack:

print(p)

return True

for dir in dirs:

nextNode = dir(curNode[0], curNode[1])

if maze[nextNode[0]][nextNode[1]] == 0:

#找到了下一个

stack.append(nextNode)

maze[nextNode[0]][nextNode[1]] = -1 # 标记为已经走过,防止死循环

break

else:#四个方向都没找到

maze[curNode[0]][curNode[1]] = -1 # 死路一条,下次别走了

stack.pop() #回溯

print("没有路")

return False

mpath(1,1,8,8)

python迷宫问题的所有路径_python——迷宫问题总结相关推荐

  1. python获取当前路径和上一层路径_python获取当前路径和上一级路径

    围观人数: 3 标签:getc   当前目录   路径   print   bsp   获取   目录   dir   dirname """获取当前目录"&q ...

  2. python 获取向上两级路径_Python学习第171课--相对路径和绝对路径

    [每天几分钟,从零入门python编程的世界!] 这节我们补充2个概念:相对路径和绝对路径. ●绝对路径 就像一棵大树一样,从它的根开始,往上会有大的枝干,在大的枝干上面又会有小一点的树枝,小树枝上面 ...

  3. python f.write 保存图片到路径_Python实现生成图片路径和对应标签的方式

    学计算机的同学都知道图片的路径更改特别麻烦,尤其要对应到相应的标签,这个让人炸花了眼,接下来就会通过python语言直接生成图片对应标签,大家也知道现在的python特别的火爆,原因就是它能够处理很多 ...

  4. python sys.path.append()添加路径_Python调用CST进行天线建模仿真:环境搭建指南

    CST微波工作室支持使用Matlab对其进行调用,但是一直以来官方没有提供python调用接口,但在最新的CST2020更新中添加了对Python3.6的调用支持,在安装路径下就已经附带了python ...

  5. 启动python项目找不到路径_Python os.startfile找不到FI

    我对Python编程有问题.在我的程序中,我使用os.startfile()来启动程序,但它不允许我这样做. 当我的程序执行启动文件的命令时,我在Windows脚本主机中收到以下错误:Script: ...

  6. python rarfile不支持中文路径_python使用zipfile解压文件中文乱码问题

    中文在编程中真实后娘养的,各种坑爹,python3下中文乱码这个问题抓破了头皮,头疼.看了alex的文章,才有种恍然大悟的感觉(链接在底部). 一句话,就是转换成unicode,压缩前是什么编码,使用 ...

  7. python如何获取文件的路径_python文件路径如何获取文件名?

    上次有小伙伴就来咨询小编这个问题,但是思索好久,不知道怎么跟大家详细阐述,因为很多小伙伴都是正在学习基础内容,还有些小伙伴都已经快达到进阶了,后来,想了很久,终于给大家解答了这个问题,下面内容不仅适合 ...

  8. python下载找不到路径_python安装后的目录在哪里

    从官网下载python的安装包,安装过程中可选择装在C盘或D盘或者其他的磁盘. 如果忘记了安装在哪里,可以在命令行中使用以下命令where python 会显示python的绝对路径C:\Users\ ...

  9. python根据文件名获取文件路径_python 查看文件名和文件路径

    以下是把sourceDir目录下的以.JPG结尾的文件所有拷贝到targetDir目录下: >>>import os >>> import os.path > ...

最新文章

  1. [转]使用设计模式改善程序结构(二)
  2. Job make U funck Uself!!!
  3. arrays.sort(._Arrays.sort与Arrays.parallelSort
  4. 湛江高考2021成绩查询,2021广东省高中学业水平考试成绩查询(入口+方式)
  5. 单列表_使用Excel中的quot;记录单quot;功能快速录入数据
  6. php实现ftp上传,PHP_PHP实现ftp上传文件示例,FTP上传是PHP实现的一个常见且 - phpStudy...
  7. jQuery中 index() 方法的使用
  8. Progressive Web App:模仿原生应用的Web应用
  9. 每日一句20200104
  10. 375.猜数字大小II
  11. Jenkinsfile脚本实现master、slave节点(agent)共享内容
  12. html 文字 向上滚动代码,文字向上滚动代码
  13. layui table切换html,解决Layui中切换tab时table样式错乱问题
  14. 有一个函数y=x(x「1),y=2x-1(1「=x「10),y.=3x-11(x」=10)。写一段程序,输入x,输出y值
  15. UG 信息窗口弹不出来 测量 长度 角度 信息 窗口 弹不出来
  16. 【游戏客户端开发】Unity3D 学习笔记2——了解U3D引擎的操作面板和各种工具
  17. 关于新iPad充电的一些误读
  18. 2022年1~6中国市场汽车销量可视化
  19. android截视频软件,裁剪切视频app
  20. Python(1)概述与基础

热门文章

  1. HDU ACM 1162 Eddy's picture
  2. 学习C++之父的最新姐妹作笔记2
  3. 基于vmware服务器虚拟化管理,基于Vmware的服务器虚拟化管理论文.doc
  4. php sql 字段名称,PHPSQL Server – 字段名称被截断
  5. unity 弹出式菜单_Java Swing JMenu和JPopupMenu:菜单和弹出式菜单
  6. c++吃豆人代码_山药豆的功效与作用营养功效
  7. 用矩阵内积的办法构造迭代次数受控的神经网络1:0.6:0.1=4:3:2
  8. 【Matlab】绘制不同颜色线条
  9. 1.9 程序示例--局部加权线性回归-机器学习笔记-斯坦福吴恩达教授
  10. verilog一些小知识点注意事项集合