python——迷宫问题总结

2023-05-16

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

代码一: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)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python——迷宫问题总结 的相关文章

随机推荐

  • micropython 8266 驱动 12864G 液晶LCD屏幕

    1 xff0c 接线顺序 引脚定义 cs 61 Pin 4 片选 reset 61 Pin 5 复位 rs 61 Pin 16 数据 指令 1数据 0 指令 DC sda 61 Pin 13 数据信号 sck 61 Pin 14 时钟信号
  • 【软件工程】之结构化分析

    结构化分析 6 1引言6 2结构化分析建模6 3面向数据流的建模方法6 4面向数据的建模方法6 5面向状态的建模方法6 6思考题1 结构化分析的特点2 数据流图的建模元素3 数据字典 结构化需求分析的建模方法 xff1a 面向数据流的建模方
  • 在 Linux 下用 mkdir 命令来创建目录和子目录

    了解了用 ls 命令在目录中列出条目后 xff0c 现在我们要学习在 Linux 系统下创建目录 在 Linux 下 xff0c 我们可以使用 mkdir命令 Mkdir 是 make directory 的缩写词 mkdir 是什么呢 M
  • win10下删除ubuntu及其引导项

    本文主要针对UEFI和GPT双系统下Ubuntu EFI分区及启动项的删除 1 查看电脑分区信息 电脑分区信息如我上一篇博客所示 xff0c 打开win10磁盘管理器 xff0c 可以看到相应分区信息 xff0c 具体如下图 根据个人分区方
  • STM32F1,F4,L1系列禁止JTAG和SW引脚方法

    STM32F1系列 程序中在使用到JTAG SWD的某个IO 时 xff0c 需要禁用掉相关调试方法后 xff0c 再配置相应的IO方式 在需要相应的接口配置前使用这些代码 对于F1系列 xff0c 调用函数进行专门的禁止 标准库配置方式
  • 数据库关系代数思维导图

  • 关于树莓派VNC图形登录界面重复登录,并显示can not show the desktop的解决办法。

    最近我也遇到了这么一个烦人的问题 xff0c 就是树莓派一直重复登录都登不进去 首先介绍一下背景 xff0c 我用树莓派的官方镜像烧录工具重新烧录了我之前的备份 xff0c 但是发现putty可以远程登录到pi 而使用vnc远程登录无法登录
  • Ubuntu开机进入终端完成自救

    由于设置了etc下的关键配置 xff0c 导致系统一直卡在开机界面进不到系统桌面 xff0c 所以记录下自救的过程 1 重启开机后选择Ubuntu高级选项 xff0c 然后点击带有Recover的 xff0c 再点击Drop to root
  • 女生写的如何追mm.看完后嫩头青变高手

    我是女生 xff0c 看到有的男生想追自己喜欢的女孩子又不敢追 xff0c 还想人家倒追她 xff0c 我很反感 从一个女生的角度 xff0c 我比较了解女孩子的心理 女孩子大多不会主动出击 xff0c 去追求自己喜欢的男孩 xff0c 除
  • 使用Dockerfile创建docker镜像

    在Dockerfile中用到的命令有 FROM FROM指定一个基础镜像 xff0c 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令 至于image则可以是任何合理存在的image镜像 FROM 一定是首个非注释指
  • Ubuntu下软件更新无法安装的问题

    Ubuntu安装软件提示 需要安装不能信任的软件包 解决办法 用 Ubuntu 安装输入法软件包时提示 需要安装不能信任的软件包 xff0c 这个动作需要从没有授权的软件源来安装软件包 xff0c 赋予权限执行仍然无法安装 xff0c 上网
  • 【C#】C#中FTP的操作

    C 完成与FTP服务器交互的功能代码 包括连接FTP 上传文件 下载文件 创建文件夹 删除文件夹 目录列表 获取指定文件大小 对文件的重命名 移动文件 判断路径是否存在等功能 using System using System Collec
  • 深浅层特征融合——CBNet

    写在前面 本系列博客 深浅层特征融合 对几篇出现较新的深浅层特征融合算法进行简要介绍 xff0c 多为本人的论文笔记 xff0c 记录了一个深度学习小学生在看论文时想到的问题 论文题目 xff1a CBNet A Novel Composi
  • U盘安装mips架构的Deepin(或UOS)系统及配置适用的源

    安装环境 请确保您的电脑满足以下的配置要求 xff0c 如果您的电脑配置低于以下要求 xff0c 将无法完美地体验深度操作系统 xff1a 内存 xff1a 至少 2G 内存 RAM xff0c 4G 以上是达到更好性能的推荐值硬盘 xff
  • label smooth方法论文调研

    待看论文 xff1a When Does Label Smoothing Help xff08 重点要看的 xff09 Regularizing Neural Networks by Penalizing Confident Output
  • 动手实践——docker中利用jupyter对数据增强操作进行可视化

    整体流程 docker容器内搭建合适环境 gt 开启jupyter notebook gt 浏览器里敲数据增强操作代码 gt 可视化 搭建环境 参考博客 https segmentfault com a 1190000007448177 1
  • 半监督-SelfMatch-论文阅读笔记

    阅读背景 SimCLR在2020年2月第一次挂在arxiv上 xff0c 被ICML 2020接收 FixMatch在2020年1月第一次挂在arxiv上 xff0c 被NIPS 2020接收 概括总结 SelfMatch方法和 FixMa
  • AI提效工具|借助chatgpt快速读论文,快速总结、归纳、索引相似文章

    目前新论文层出不穷 xff0c 快速阅读论文 成为研究者们一个必备能力 本文简单记录了近期出现的两个借助chatgpt来帮助我们快速读论文的 神器 xff0c 帮助大家快速上手应用 xff0c 迅速提升论文阅读速度 此外 xff0c 本人也
  • 【更新中】目标检测——梳理,准备面试

    最近在准备找工作面试 xff0c 本文在此梳理了目标检测中涉及的面试要用的知识点 xff0c 包含了一下几方面 xff1a My paper reading 过程总结 xff1a 实际步骤所花时间评价改进先看了abstract 1 intr
  • python——迷宫问题总结

    关于迷宫问题 xff0c 常见会问能不能到达某点 xff0c 以及打印到达的最短路径 可以用回溯法 43 递归来解决 代码一 xff1a dfs 43 回溯 将矩阵外围以及路障统一设置为 1 设置current step和next step