CCF CSP认证历年题目自练 Day39

news2024/11/16 10:28:32

题目

试题编号: 201312-5
试题名称: I’m stuck!
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  给定一个R行C列的地图,地图的每一个方格可能是’#‘, ‘+’, ‘-’, ‘|’, ‘.’, ‘S’, ‘T’七个字符中的一个,分别表示如下意思:
  ‘#’: 任何时候玩家都不能移动到此方格;
  ‘+’: 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非’#‘方格移动一格;
  ‘-’: 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非’#‘方格移动一格;
  ‘|’: 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非’#‘方格移动一格;
  ‘.’: 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为’#’,则玩家不能再移动;
  ‘S’: 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非’#‘方格移动一格;
  ‘T’: 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非’#‘方格移动一格。
  此外,玩家不能移动出地图。
  请找出满足下面两个性质的方格个数:
  1. 玩家可以从初始位置移动到此方格;
  2. 玩家不可以从此方格移动到目标位置。
输入格式
  输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。
  接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个’S’和一个’T’。
输出格式
  如果玩家在初始位置就已经不能到达终点了,就输出“I’m stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。
样例输入
5 5
–±+
…|#.
…|##
S-±T
####.
样例输出
2
样例说明
  如果把满足性质的方格在地图上用’X’标记出来的话,地图如下所示:
  --±+
  …|#X
  …|##
  S-±T
  ####X

题目分析(个人理解)

  1. 此题一看就是走迷宫的题目,能否到达可以联想为小鼠走迷宫,题目要求输出的值满足两个条件1. 玩家可以从初始位置移动到此方格;2. 玩家不可以从此方格移动到目标位置。总结一句也就是输出小鼠可以到达且不是终点的位置有几个。如果找不到出口
    就输出‘I’m stuck!’。
  2. 首先想到DFS算法,注意,此题不同的是T即是终点也可选择作为起点,而S只能是起点,根据题目先建立一个长为r,宽为c的画布(地图), 接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个’S’和一个’T’, 还是选择二维列表作为存储器。
  3. 使用.append()方法追加写入(创建地图matrix),遍历地图找到初始出发点S,和终点T,并记录。dfs算法本身原理就是基于递归算法的,现在定义两个函数,第一个是关于S,此函数表示从S出发,能够到达的坐标点全部用一张新图记录,如果能够到达那就将新画布对应的坐标位置的值设置为1,如果到达不了就是默认值0,(画布是初始值为0的二维列表)。
    4.下面进入条件判断的环节(dfs算法的代码结构就是在函数体内调用自己的一个子函数实现递归)在子函数内设置判断条件如果原画布是’#‘就说明到不了(墙壁),子函数的作用是将能够到达的点全部标记为1,下面进入判断,如果是ST+就可以上下左右都可以移动,如果是’|‘只能上下移动,如果是’-‘只能左右移动,’.‘只能向下移动。移动的判断条件有两个第一个是不能超出地图,第二个是值为0的地方(表示没走到过,现在用子函数来标记,能够走到的就标记为1,尤其注意,即使不是#,也有可能到达不了),在函数S的画布中标记了所有从S出发后能够到达的所有方格(标记为1),只需要把T点带入如果值为1则能到达,如果值为0我就输出(‘I’m stuck!’)。
  4. 下面再仔细读题,到达T后可以选择结束游戏,也可以继续,那么此时T就成了起点,那么还得再定义一个函数T,和函数S一样,再做一个画布,和S同样操作,将从T出发,能够到达的所有格子全部标记1。如果从S出发能到达T,就请找出满足下面两个性质的方格个数:
      1. 玩家可以从初始位置移动到此方格;
      2. 玩家不可以从此方格移动到目标位置。
  5. 那么一句话:就是求在S画布中标记,在画布T中未标记的方格有几个。只需要一个计数器,初始值为0,满足上面条件加1即可。
  6. 上代码!!!
# input
line = input()
nums = line.split()
R = eval(nums[0])
C = eval(nums[1])
matrix = []
for i in range(R):
    matrix.append(input())
# print(R,C)
# print(matrix)

# find S and T
for i in range(R):
    for j in range(C):
        if matrix[i][j] == 'S':
            xS, yS = i, j
for i in range(R):
    for j in range(C):
        if matrix[i][j] == 'T':
            xT, yT = i, j

        # traverse from S


def traverseS():
    def inner(x, y):
        if matrix[x][y] == '#':
            return
        res[x][y] = 1
        if x < R - 1 and matrix[x][y] in 'ST+|.' and res[x + 1][y] == 0:
            inner(x + 1, y)
        if x > 0 and matrix[x][y] in 'ST+|' and res[x - 1][y] == 0:
            inner(x - 1, y)
        if y < C - 1 and matrix[x][y] in 'ST+-' and res[x][y + 1] == 0:
            inner(x, y + 1)
        if y > 0 and matrix[x][y] in 'ST+-' and res[x][y - 1] == 0:
            inner(x, y - 1)

    res = [[0 for i in range(C)] for j in range(R)]
    inner(xS, yS)
    return res


# traverse from T reversely
def traverseT():
    def inner(x, y):
        if matrix[x][y] == '#':
            return
        res[x][y] = 1
        if x < R - 1 and matrix[x + 1][y] in 'ST+|' and res[x + 1][y] == 0:
            inner(x + 1, y)
        if x > 0 and matrix[x - 1][y] in 'ST+|.' and res[x - 1][y] == 0:
            inner(x - 1, y)
        if y < C - 1 and matrix[x][y + 1] in 'ST+-' and res[x][y + 1] == 0:
            inner(x, y + 1)
        if y > 0 and matrix[x][y - 1] in 'ST+-' and res[x][y - 1] == 0:
            inner(x, y - 1)

    res = [[0 for i in range(C)] for j in range(R)]

    inner(xT, yT)
    return res


# main
propt1 = traverseS()
propt2 = traverseT()
if propt1[xT][yT] == 0:
    print("I'm stuck!")
else:
    count = 0
    for i in range(R):
        for j in range(C):
            if propt1[i][j] == 1 and propt2[i][j] == 0:
                count += 1
    print(count)

举一反三

  1. 下面用一道蓝桥杯的题目练手:
    在这里插入图片描述
    样例输出:
    在这里插入图片描述
  2. 代码如下:
    在这里插入图片描述

总结

 	大学问
知道什么叫天高地厚
内心的天空 也要懂得探究
知道什么是海市蜃楼
人海的感受 也要去进修
知识跟世界细水长流
智慧用思考照明宇宙
我们懂得学问没尽头
学会怎么做事 再学做人的操守
我们懂得学习的理由
吸收是为了奉献 才能承先启后
生命不止坚毅与奋斗
有梦想才是 有意义的追求
成功不止付出与拥有
有承担才是 最高的成就
知识跟世界细水长流
智慧用思考照明宇宙
我们懂得学问没尽头
学会怎么自救 再学做人的操守
我们懂得学习的理由
力量要用来分享 才能承先启后
我们懂得学问没尽头
学会终身学习 才没辜负一番造就
我们懂得学习的理由
活出生命的光彩 才无愧于春秋

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1143992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系列十九、循环依赖(一)

一、概述 循环依赖是指&#xff0c;多个bean之间相互依赖&#xff0c;形成了一个闭环。比如A依赖于B、B依赖于C、C依赖于A&#xff0c;形成了一个圈。 二、两种方式对循环依赖的影响 2.1、官网说明 2.2、结论 我们AB循环依赖问题只要A的注入方式是setter、并且是singleton&am…

Android14 WMS启动流程

一 概述 本文Android14源代码可参考&#xff1a;Search 在 Android 系统中&#xff0c;从设计的角度来看&#xff0c;窗口管理系统是基于 C/S 模式的。整个窗口系统分为服务端和客户端两大部分&#xff0c;客户端负责请求创建窗口和使用窗口&#xff0c;服务端完成窗口的维护…

智慧工地管理系统源码-数字孪生智慧工地可视化解决方案

一、智慧工地建设背景 我国经济发展正从传统粗放式的高速增长阶段&#xff0c;进入高效率、低成本、可持续的中高速增长阶段。随着现代建筑的复杂度和体量等不断增加&#xff0c;施工现场管理的内容越来越多&#xff0c;管理的技术难度和要求在不断提高。传统的施工现场管理模…

用超声波清洗机洗眼镜的有哪些?清洁力强的超声波清洗机不能错过

超声波清洗机在清洗眼镜方面表现出色&#xff0c;其强大的清洁能力可以彻底清除眼镜上的污垢和细菌。这种清洗方式被认为是一种高效且卫生的清洁方式&#xff0c;因为它利用高频振动和微射流打击力来清除污垢和细菌&#xff0c;而不是使用化学物质。对于那些长时间佩戴眼镜或者…

windows + ubuntu + vscode开发环境配置安装

一、卸载WSL/WSL2 如果安装了windows子系统的朋友&#xff0c;可以选择继续使用。或者提前卸载WSL&#xff0c;再选择安装虚拟机。虚拟机占用内存较大&#xff0c;WSL可能对于开发的一些需求还有欠缺。根据自己的实际情况进行选择。 WIN10/11安装WSL(请参考官方资料&#xff0c…

TSINGSEE青犀智慧仓储可视化视频智能监管系统方案

一、背景与需求 对于现在很多大型工厂或者物流基地来说&#xff0c;仓库无疑是存放物品的重点场所。仓储存放着大量货物&#xff0c;同时存在大量的辅助设备&#xff0c;需要进行全方位的监管&#xff0c;以避免发生安全事故&#xff0c;造成财产损失。原有的人工巡检方式已无…

Ubuntu安装AdGuardhome(树莓派安装AdGuardhome)

Ubuntu安装AdGuardhome&树莓派安装AdGuardhome 1.什么是AdGuardhome2.设备情况3.3.1.下载AdGuardhome3.2.解压3.3.安装3.4.仪表盘配置3.5.dns黑名单添加3.6.DNS白名单设置3.7常规设置3.8. dns设置3.9.加密设置 4.客户端设置 1.什么是AdGuardhome AdGuard Home 是网络范围的…

传奇服务器配置如何搭建

传奇服务器在中国页游发展中作为一个经典制作吸引了很多玩家的喜欢&#xff0c;很多人也想搭建一个属于自己团队的传奇游戏服务器&#xff0c;今天就让小编来讲一讲该如何搭建吧&#xff01; 首先是硬件配置&#xff0c;传奇游戏的服务器需要较高的硬件配置&#xff0c;选择双路…

Kubernetes数据卷Volume和数据卷分类(emptyDir、nfs、hostPath、ConfigMap)详解

Kubernetes数据卷Volume和数据卷分类详解 数据卷概述 Kubernetes Volume&#xff08;数据卷&#xff09;主要解决了如下两方面问题&#xff1a; 数据持久性&#xff1a;通常情况下&#xff0c;容器运行起来之后&#xff0c;写入到其文件系统的文件暂时性的。当容器崩溃后&am…

window系统修改rabbitmq 默认端口

安装完rabbitmq之后&#xff0c;默认的client端口是5672, 控制台访问端口是15672&#xff0c;rabbitmq管理工具启动之后在浏览器中输入地址&#xff1a; ​ ​http://localhost:15672/​​​ 就可以访问后台​ ​​​&#xff0c; 默认管理员账号&#xff1a;guest 密码&#x…

移动云获取推拉流地址

一&#xff1a;帮助文档&#xff1a; 移动云帮助中心https://ecloud.10086.cn/op-help-center/doc/category/753 二&#xff1a;准备工作&#xff1a; 1&#xff1a;进入移动云首页&#xff0c;点击【产品】>【视频服务】>【视频服务】>【视频直播】 点击【立即订购…

图纸管理制度 《五》

1、存档文件应由专人管理&#xff0c;其他人未征得管理人员同意&#xff0c;不得随意翻阅查看。 2、档案管理人员要认真贯彻执行公司相关制度&#xff0c;严禁泄露档案材料中的秘密。 彩虹图纸管理软件_图纸管理系统_图纸文档管理软件系统_彩虹EDM【官网】彩虹EDM图纸管理软件…

Linux进程控制/进程终止

一、系统调用fork函数 1、fork返回值及内核操作 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回 0 &#xff0c;父进程返回子进程 id &#xff0c;出错返回 -1 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核做&am…

UE4 体积云制作 学习笔记

首先Noise本来就是一张噪点图 云的扰动不能太大&#xff0c;将Scale调小&#xff0c;并将InputMin调整为0 形成这样一张扰动图 扰动需要根据材质在世界的位置进行调整&#xff0c;所以Position需要加上WorldPosition 材质在不同世界位置&#xff0c;噪点不同 除以一个数&#…

会声会影2024(Corel VideoStudio)正式版安装下载步骤教程

众所周知会声会影(Corel VideoStudio)2024为加拿大Corel公司发布的一款功能丰富的视频编辑软件。实际上我们可以这样讲添加样子和款式&#xff1a;使用数百种创意拖放效果和滤镜增个性和艺术格调。值得肯定的是添加趣味性3D标题&#xff0c;内置NewBlueFX和proDAD转场和防抖插件…

基于头脑风暴算法的无人机航迹规划-附代码

基于头脑风暴算法的无人机航迹规划 文章目录 基于头脑风暴算法的无人机航迹规划1.头脑风暴搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用头脑风暴算法来优化无人机航迹规划。 …

矩阵特征值与特征向量的理解

各位朋友大家好&#xff0c;我是小C哈哈哈&#xff0c;很高兴认识大家&#xff0c;在这里&#xff0c;我会将一些枯燥难懂的数学和算法知识以图片或动画的形式通俗易懂的展现给大家&#xff0c;希望大家喜欢。 线性代数中的矩阵特征值与特征向量这两个基本概念总是让很多人摸不…

接口自动化框架篇:流程封装与基于加密接口的测试用例设计

​接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法&#xff0c;是远远不够的&#xff0c;还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以&#xff0c;接下来&#xff0c;我们主要介绍下接口测试用例分析以及通用的流程封装是如…

nginx配置域名(ssl和非ssl形式)

概要 本文以阿里云为例&#xff0c;浅要介绍如何将域名指向你的服务器&#xff0c;以及如何配置ssl和非ssl的方式。 购买域名 购买域名不做描述&#xff0c;本文域名以helloword.com为例 域名实名与备案 购买后&#xff0c;不实名和备案是无法使用的&#xff0c;这里不展开…

Games 103 作业二

Games 103 作业二 作业二其实就是要使用隐式积分和PBD两种方式来实现布料求解。难度相对于作业一来说要简单一些&#xff0c;在文档中基本把步骤都写清楚了。主要逻辑首先参考Lecture 05 PPT的第18页&#xff1a; 然后我们按照文档的步骤一步一步地来。注意0号顶点和20号顶点是…