迷宫 蓝桥杯 602

2023-11-12

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可以通行的地方。

010000
000100
001001
110000

迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。

对于上面的迷宫,从入口开始,可以按 DRRURRDDDR 的顺序通过迷宫, 一共 1010 步。其中 DULR 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。

请注意在字典序中 D<L<R<U

01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000

思路:要求步数最少的走法,用BFS广度优先搜索,到终止点之后,回溯至起点

from queue import Queue#队列模块
import sys
# 打印路径
def print_path(x, y):
    if x==1 and y==1: return                # 回溯到了起点,递归结束,返回
    if pre[x][y]=='D': print_path(x-1, y)   # 回溯,往上U
    if pre[x][y]=='L': print_path(x, y+1)   # 回溯,往右R
    if pre[x][y]=='R': print_path(x, y-1)
    if pre[x][y]=='U': print_path(x+1, y)
    print(pre[x][y], end="")  #最后打印终点

mp = []
for i in range (0,30):mp. append (input())      # 读迷宫
# 加上围墙,就不需要再判断出界问题
for i in range(len(mp)):
    mp[i] = '1'+ mp[i] + '1'                    # 为迷宫加左边和右边的围墙
mp = [52 * '1'] + mp +[52* '1']                 # 为迷宫加上面和下面的围墙
#这里也可以判断范围在下面访问新节点之后判断
#if nx>=0 and nx<=49 and ny>=0 and ny<=29:#判断新格子是否还在矩阵中
vis = [list(map(int,list(i))) for i in mp]      # 记录迷宫的状态
k = ('D', 'L', 'R', 'U')                        # 四个方向:按字典序从小到大来排,先访问字典序小的
dir = ((1,0),(0,-1),(0,1),(-1,0))
pre = [[(-1,-1)] * 52 for i in range(32)]     # 用于保存前一个点
# BFS:实现队列
vis[1][1] = 1                                   # 起点是(1,1)
q = Queue()
q.put ((1,1))                                   # # 以(1,1)为起点开始移动#put()插入元素到队尾
while q.qsize() != 0:                           # 队列不为空
    x, y = q.get ()                             # 弹出队头
    if x==30 and y==50: print_path(30,50); sys.exit()  # 终止条件:到达右下角。打印完整路径,退出
    for i in range(4):                          # 遍历邻居点的四个方向
        nx = x + dir[i][0]
        ny = y + dir[i][1]
        if vis[nx][ny] != 1:                    # 把访问过的点变成墙,后面不再访问
            vis[nx][ny] = 1
            pre[nx][ny] = k[i]                  # pre:记录它的前驱点
            q.put((nx,ny))                      # 加入队头的邻居点
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迷宫 蓝桥杯 602 的相关文章

随机推荐

  • ENU、EPSG、ECEF坐标系科普(三维重建)

    科普一 ENU和EPSG实际上代表了两个不同的概念 这两者并不是直接对比的 1 ENU坐标系 ENU坐标系是一种本地切面坐标系 用于表示与地理位置相关的空间数据 在ENU坐标系中 E代表东 East N代表北 North U代表上 Up 它
  • LeetCode 406. Queue Reconstruction by Height 解题报告

    LeetCode 406 Queue Reconstruction by Height 解题报告 题目描述 Suppose you have a random list of people standing in a queue Each
  • 算法—反转链表

    题目 实现单链表的逆转函数 输入一个链表 反转链表后 返回翻转之后的链表 分析 利用三个指针 head node nodeNext node指向当前结点 head指向当前结点的前一个结点 nodeNext指向当前结点的后一个结点 先将hea
  • 浏览器动态显示服务器日志,基于 websocket 实现远程实时日志 在浏览器中查看设备的运行日志...

    本文介绍一个基于websocket实现的远程实时日志系统 可以通过浏览器查看远程移动设备的实时运行日志 系统由三个部分组成 1 服务器 与移动设备和浏览器建立websocket连接 将移动设备websocket上读取的实时日志转发到对应的浏
  • 每日算法-回文链表

    题目 请判断一个链表是否为回文链表 示例 1 输入 1 gt 2 输出 false 示例 2 输入 1 gt 2 gt 2 gt 1 输出 true 进阶 你能否用 O n 时间复杂度和 O 1 空间复杂度解决此题 解法 思路一 先把链表的
  • QGIS自定义地图工具

    官方示例 首先看一下官方文档中的矩形工具源码 class RectangleMapTool QgsMapToolEmitPoint def init self canvas self canvas canvas QgsMapToolEmit
  • fatal: pathspec ‘fileName‘ did not match any files 解决办法

    再删除文件的时候突然出现了这个问题 fatal pathspec fileName did not match any files 分析如下 这个文件怎么回事 为什么删不掉 难道是分支的错误 还是怎么回事 产生原因 该文件存在于 gitig
  • C语言----实现有向图/无向图的创建与基本操作(深度、广度优先遍历)

    最近发现一个不错的项目 Github上数据结构所有算法源码实现 数据结构 严蔚敏 吴伟民 教材源码与习题解析 1 图的数组 邻接矩阵 存储表示 包含算法 有向图 无向图创建 添加顶点 删除边 插入边 深度优先遍历 递归 广度优先遍历 队列实
  • 跨平台的桌面应用程序开发框架Electron

    electron electron Stars 109 3k License MIT Electron 是一个基于 Node js 和 Chromium 的开源框架 允许使用 JavaScript HTML 和 CSS 编写跨平台的桌面应用
  • Elasticsearch系列---聚合查询原理

    概要 本篇主要介绍聚合查询的内部原理 正排索引是如何建立的和优化的 fielddata的使用 最后简单介绍了聚合分析时如何选用深度优先和广度优先 正排索引 聚合查询的内部原理是什么 Elastichsearch是用什么样的数据结构去执行聚合
  • linux 下交换 esc与cap的方法。

    有两种方法 1 xmodmap 2 dconf editer 操作如下图所示 xkb options 改为图片所示
  • STM32项目 -- 选题分享(部分)

    前言 分享部分STM32项目选题以及实现效果 暂时没有分享代码 列表 编号 项目名称 难度 使用器件 实现效果 1 基于STM32的智能万用表设计 3 STM32F103C8T6 OLED 1 测量电压 2 OLED显示测量值 3 实现层级
  • ASP.NET-----Repeater数据控件的用法总结

    一 Repeater控件的用法流程及实例 1 首先建立一个网站 新建一个网页index aspx 2 添加或者建立APP Data数据文件 然后将用到的数据库文件放到APP Data文件夹中 3 打开数据库企业管理器 数据库服务器为loca
  • 【帧同步】关于状态同步的经验分享

    方案 低延迟环境下 比如国内 局域网情况下 写个同步那都不是难事 是个客户端看点书就会写了 难点在于 如何去处理 高延迟 以及及时响应的情况 我举个例子 fps或者tank游戏中 子弹和炮弹的射速是很快的 如果两边在对轰过程中 又碰到了 附
  • Qt (ui界面)信号与槽函数 组件连接

    重点 信号与槽连接机制 难点 信号与槽函数的 参数使用 头函数 ifndef WIDGET H define WIDGET H include
  • 登录页面,表单提交,参数不显示

    一开始的form
  • curl下载文件

    我的个人博客 逐步前行STEP curl url o filename progress 下载url的内容到文件filename中 并显示下载进度
  • 深度学习面试八股文(2023.9.06)

    一 优化器 1 SGD是什么 批梯度下降 Batch gradient descent 遍历全部数据集算一次损失函数 计算量开销大 计算速度慢 不支持在线学习 随机梯度下降 Stochastic gradient descent SGD 每
  • 三种常用的排序方法图解及C语言实现(选择排序,冒泡排序,快速排序)

    选择排序 冒泡排序 快速排序 选择排序 选择排序是最简单直观的一种算法 选择排序是不稳定排序 基本思想 首先在未排序序列中找到最小 大 元素 存放到排序序列的起始位置 然后 再从剩余未排序元素中继续寻找最小 大 元素 然后放到已排序序列的末
  • 迷宫 蓝桥杯 602

    题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可以通行的地方 010000 000100 001001 110000 迷宫的入口为左上