CCF CSP认证历年题目自练 Day39

题目

试题编号: 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!’)。
  5. 下面再仔细读题,到达T后可以选择结束游戏,也可以继续,那么此时T就成了起点,那么还得再定义一个函数T,和函数S一样,再做一个画布,和S同样操作,将从T出发,能够到达的所有格子全部标记1。如果从S出发能到达T,就请找出满足下面两个性质的方格个数:
      1. 玩家可以从初始位置移动到此方格;
      2. 玩家不可以从此方格移动到目标位置。
  6. 那么一句话:就是求在S画布中标记,在画布T中未标记的方格有几个。只需要一个计数器,初始值为0,满足上面条件加1即可。
  7. 上代码!!!
# 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 Sdef traverseS():def inner(x, y):if matrix[x][y] == '#':returnres[x][y] = 1if 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] == '#':returnres[x][y] = 1if 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 = 0for i in range(R):for j in range(C):if propt1[i][j] == 1 and propt2[i][j] == 0:count += 1print(count)

举一反三

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

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++跨平台构建工具CMake-----灵活添加库并实现开发和生产环境的分离

目录 1.概述2.创建项目3 配置运行项目3.1 编写开平方根示例代码3.2 编写CMake构建脚本 4.使用子模块实现求平方根的功能4.1 在子模块中实现两种求平方根的方法4.2 构建Mathfunctions子模块4.3 在根目录引用子模块的功能4.3.1 编写构建脚本4.3.2 编写C代码使用MathFunctions库中…

qt高精度定时器的使用停止线程应用

##线程停止 //线程停止应用 public: explicit WorkerThread(QObject *parent 0) :QThread(parent), m_bStopped(false){qDebug() << "Worker Thread : " << QThread::currentThreadId();}~WorkerThread(){stop();quit();wait();}void stop() {qDebug()…

队列(Queue)概念+通过单、双链表来模拟队列+环形队列+OJ面试题(用队列实现栈、用栈实现队列、设计环形队列)

文章目录 队列(Queue)一、 概念1.尾进头出 二、模拟队列1.单链表实现队列1.1 设置结点1.2 入队offer1.3出队 poll1.4 empty方法&#xff0c;peek方法&#xff0c;getUsedSize方法 2.双链表实现队列2.1 创建结点2.2 入队列2.3 出队列2.4 peek、size、isEmpty方法 三、环形队列1.…

小程序源文件的简单获取方法分享

小程序的源文件地址 在微信的服务器上。普通用户想要直接获取到在微信服务器去获取,肯定是十分困难的,有没有别的办法呢? 简单思考一下我们使用小程序的场景就会明白,当我们点开一个微信小程序的时候,其实是微信已经将它的从服务器上下载到了手机,然后再来运行的。所以我…

Android:窗口管理器WindowManager

Android&#xff1a;窗口管理器WindowManager 导言 本篇文章主要是对Android中与窗口(Window)有关的知识的介绍&#xff0c;主要涉及到的有&#xff1a; WindowWindowManagerWindowManagerService 主要是为了更进一步地向下地深入Android屏幕渲染的知识&#xff08;虽然窗口…

打破尺寸记录!荷兰QuTech研发16量子点阵列新技术

承载16个量子点交叉条阵列的量子芯片&#xff0c;可无缝集成到棋盘图案&#xff08;图片来源&#xff1a;网络&#xff09; 由荷兰代尔夫特理工大学(TU Delft)和荷兰应用科学研究组织(TNO)组建的荷兰量子计算研究中心QuTech的研究人员开发了一种用相对较少的控制线来控制大量量…

Python 算法高级篇:图的表示与存储优化

Python 算法高级篇&#xff1a;图的表示与存储优化 引言 1. 什么是图&#xff1f;2. 图的基本概念3. 图的表示方法3.1. 临接矩阵表示临接矩阵的优点&#xff1a;临接矩阵的缺点&#xff1a; 3.2. 邻接表表示邻接表的优点&#xff1a;邻接表的缺点&#xff1a; 4. 优化的存储方法…

【C++笔记】C++继承

【C笔记】C继承 一、继承的概念二、继承的语法和权限三、父类和子类成员之间的关系3.1、子类赋值给父类(切片)3.2、同名成员 四、子类中的默认成员函数4.1、构造函数4.2、拷贝构造4.3、析构函数 五、C继承大坑之“菱形继承”5.1、什么是“菱形继承”5.2、解决方法 一、继承的概…

C++深度优化(DFS)算法的应用:收集所有金币可获得的最大积分

涉及知识点 深度优化(DFS) 记忆化 题目 节点 0 处现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 。给你一个长度为 n - 1 的二维 整数 数组 edges &#xff0c;其中 edges[i] [ai, bi] 表示在树上的节点 ai 和 bi 之间存在一条边。另给你一个下标从 0…

ArcGIS笔记13_利用ArcGIS制作岸线与水深地形数据?建立水动力模型之前的数据收集与处理?

本文目录 前言Step 1 岸线数据Step 2 水深地形数据Step 3 其他数据及资料 前言 在利用MIKE建立水动力模型&#xff08;详见【MIKE水动力笔记】系列&#xff09;之前&#xff0c;需要收集、处理和制作诸多数据和资料&#xff0c;主要有岸线数据、水深地形数据、开边界潮位驱动数…

位(bit)、字节(byte)、字、英文字符、中文字符的关系详解(涵盖字符编码)

目录 0 引言1 位、字节、字2 字符编码2.1 为什么要有字符编码2.2 字符编码的种类有哪些拓展&#xff1a;ANSI 编码 3 英文字符与中文字符的区别 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;C专栏&#x1f4a5; 标题&#xff1a;位&#xff08;…

至高直降3000元,微星笔记本双11爆款推荐、好评有礼拿到手软

今年双11来的更早一些&#xff0c;微星笔记本先行的第一波雷影17促销活动&#xff0c;就已经领略到玩家们满满的热情。开门红高潮一触即发&#xff0c;微星笔记本双11活动周期至高直降3000元&#xff0c;众多爆款好货已经开启预约预售&#xff1a;有硬核玩家偏爱的性能双雄&…

聚观早报 |2024款飞凡R7官宣;小米14新配色材质

【聚观365】10月27日消息 2024款飞凡R7官宣 小米14新配色材质 金山办公2023第三季度业绩 IBM2023第三季度业绩 新东方2024财年第一季度业绩 2024款飞凡R7官宣 飞凡汽车官宣&#xff0c;2024款飞凡R7将于11月上市&#xff0c;新车将搭载飞凡巴赫座舱&#xff0c;同时超过1…

Node编写重置用户密码接口

目录 前言 定义路由和处理函数 验证表单数据 实现重置密码功能 前言 接前面文章&#xff0c;本文介绍如何编写重置用户密码接口 定义路由和处理函数 路由 // 重置密码的路由 router.post(/updatepwd, userinfo_handler.updatePassword) 处理函数 exports.updatePasswo…

php之 角色的权限管理(RBAC)详解

RBAC&#xff08;Role-based access control&#xff09;是一种常见的权限管理模型&#xff0c;通过将用户分配至特定的角色&#xff0c;以及为角色分配访问权限&#xff0c;实现了权限管理的目的。以下是关于RBAC的详细解释&#xff1a; 角色&#xff1a;RBAC模型的核心是角色…

65、内网安全-域环境工作组局域网探针方案

目录 案例1-基本信息收集操作演示案例2-网络信息收集操作演示案例3-用户信息收集操作演示案例4-凭据信息收集操作演示案例5-探针主机域控架构服务操作演示涉及资源 我们攻击内网一般是借助web攻击&#xff0c;直接进去&#xff0c;然后再去攻击内网&#xff0c;那么攻击的对象一…

搞懂 MySql 的架构和执行流程

搞懂 MySql 的架构和执行流程 1、MySQL 的三层架构2、SQL 的执行流程2.1、连接器2.2、解析器2.3、预处理器2.4、优化器2.5、执行器2.6、存储引擎 3、关于Select 的两个顺序 1、MySQL 的三层架构 MySQL的三层结构包括&#xff1a; 连接层&#xff1a;负责与MySQL客户端之间的通…

matlab中类的分别之handle类和value类——matlab无法修改类属性值的可能原因

写在之前&#xff08;吐槽&#xff09; 最近由于变化了一些工作方向&#xff0c;开始需要使用matlab进行开发&#xff0c;哎哟喂&#xff0c;matlab使用的我想吐&#xff0c;那个matlab编辑器又没代码提示&#xff0c;又没彩色&#xff0c;我只好用vscode进行代码编辑&#xf…

13.6性能测试理论

一.什么是性能测试 1.定义: 测试人员借助性能测试工具(LoadRunner等),模拟系统在不同场景下(使用高峰期等),对应的性能指标是否达到预期. 2.性能测试和功能测试的区别: a.功能测试依靠人工,性能测试依靠工具. b)功能测试要求软件能正常运行,不管什么场景,性能测试要求软件…

嵌入式 Tomcat 调校

SpringBoot 嵌入了 Web 容器如 Tomcat/Jetty/Undertow&#xff0c;——这是怎么做到的&#xff1f;我们以 Tomcat 为例子&#xff0c;尝试调用嵌入式 Tomcat。 调用嵌入式 Tomcat&#xff0c;如果按照默认去启动&#xff0c;一个 main 函数就可以了。 简单的例子 下面是启动…