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. 玩家可以从初始位置移动到此方格;2. 玩家不可以从此方格移动到目标位置。总结一句也就是输出小鼠可以到达且不是终点的位置有几个。如果找不到出口
就输出‘I’m stuck!’。 - 首先想到DFS算法,注意,此题不同的是T即是终点也可选择作为起点,而S只能是起点,根据题目先建立一个长为r,宽为c的画布(地图), 接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个’S’和一个’T’, 还是选择二维列表作为存储器。
- 使用.append()方法追加写入(创建地图matrix),遍历地图找到初始出发点S,和终点T,并记录。dfs算法本身原理就是基于递归算法的,现在定义两个函数,第一个是关于S,此函数表示从S出发,能够到达的坐标点全部用一张新图记录,如果能够到达那就将新画布对应的坐标位置的值设置为1,如果到达不了就是默认值0,(画布是初始值为0的二维列表)。
- 下面进入条件判断的环节(dfs算法的代码结构就是在函数体内调用自己的一个子函数实现递归)在子函数内设置判断条件如果原画布是’#‘就说明到不了(墙壁),子函数的作用是将能够到达的点全部标记为1,下面进入判断,如果是ST+就可以上下左右都可以移动,如果是’|‘只能上下移动,如果是’-‘只能左右移动,’.‘只能向下移动。移动的判断条件有两个第一个是不能超出地图,第二个是值为0的地方(表示没走到过,现在用子函数来标记,能够走到的就标记为1,尤其注意,即使不是#,也有可能到达不了),在函数S的画布中标记了所有从S出发后能够到达的所有方格(标记为1),只需要把T点带入如果值为1则能到达,如果值为0我就输出(‘I’m stuck!’)。
- 下面再仔细读题,到达T后可以选择结束游戏,也可以继续,那么此时T就成了起点,那么还得再定义一个函数T,和函数S一样,再做一个画布,和S同样操作,将从T出发,能够到达的所有格子全部标记1。如果从S出发能到达T,就请找出满足下面两个性质的方格个数:
1. 玩家可以从初始位置移动到此方格;
2. 玩家不可以从此方格移动到目标位置。 - 那么一句话:就是求在S画布中标记,在画布T中未标记的方格有几个。只需要一个计数器,初始值为0,满足上面条件加1即可。
- 上代码!!!
# 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)
举一反三
- 下面用一道蓝桥杯的题目练手:
样例输出:
- 代码如下:
总结
大学问
知道什么叫天高地厚
内心的天空 也要懂得探究
知道什么是海市蜃楼
人海的感受 也要去进修
知识跟世界细水长流
智慧用思考照明宇宙
我们懂得学问没尽头
学会怎么做事 再学做人的操守
我们懂得学习的理由
吸收是为了奉献 才能承先启后
生命不止坚毅与奋斗
有梦想才是 有意义的追求
成功不止付出与拥有
有承担才是 最高的成就
知识跟世界细水长流
智慧用思考照明宇宙
我们懂得学问没尽头
学会怎么自救 再学做人的操守
我们懂得学习的理由
力量要用来分享 才能承先启后
我们懂得学问没尽头
学会终身学习 才没辜负一番造就
我们懂得学习的理由
活出生命的光彩 才无愧于春秋
相关文章:

CCF CSP认证历年题目自练 Day39
题目 试题编号: 201312-5 试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是’#’, ‘’, ‘-’, ‘|’, ‘.’, ‘S’, ‘…...

【用户登录】模块之登录认证+鉴权业务逻辑
用户登录——⭐认证功能的流程图: ⭐鉴权流程图: 用户登录功能的Java代码实现 1. 实体类-User orm框架:JPA Table(name "user_tab") Entity Data NoArgsConstructor AllArgsConstructor public class User implements Serializ…...

开启CETOS 裸奔了一年的服务器开启firewall防火墙
记录一下关于firewall,博主非运维专家或服务器专家。 背景 客户有一台裸奔运行了一年多的系统有公网但发现没有开防火墙,iptables和firewall均是关闭状态,通过扫描发现很多漏洞。根据客户要求对端口进行重新梳理且关闭不必要或有潜在风险的…...
eslint识别不了别名解决方法
第一步 npm i eslint-import-resolver-alias -D第二步:在 eslintrc.js 配置 module.exports {settings: {import/resolver: {alias: {map: [// 这里参照webpack的别名配置映射[, ./src]],// 引用的时候可以忽略后缀extensions: [.vue, .js, .ts, .tsx, .jsx, .json…...

【windows 脚本】netsh命令
netsh 是 Windows 操作系统中的一个命令行工具,用于配置和管理网络设置。它提供了一系列的命令和参数,可以用于配置网络接口、防火墙、路由表等网络相关的设置。以下是一些常用的 netsh 命令和用法: 配置静态IP,IP地址、子网掩码和…...

二叉树三种遍历的递归与非递归写法
目录 编辑 一,前序遍历 题目接口: 递归解法: 非递归解法: 二,中序遍历 题目接口: 递归解法: 非递归写法: 三,后序遍历 题目接口: 递归解法&…...

虹科 | 解决方案 | 汽车示波器 远程诊断方案
车厂总部专家实时指导你修车 当一线汽修技师遇到疑难问题无从下手时,可以准备好pico汽车示波器套装,并戴上我们的M400智能AR眼镜,通过语音操作,呼叫主机厂的技术支持老师;老师通过AR眼镜上的摄像头老师可以实时看到现…...

Unity ScrollView最底展示
Unity ScrollView最底展示 问题方案逻辑 问题 比如在做聊天界面的时候我们肯定会使用到ScrollView来进行展示我们的聊天内容,那么这个时候来新消息的时候就需要最底展示,我认为这里有两种方案; 一种是通过算法每一条预制体的高度*一共多少…...

linux常用基本命令大全的使用(三)
🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页石马农青衿 🌄每日一句:努力一点,优秀一点 📑前言 本文主要是linux常用基本命令面试篇文章,如果有什么…...
Qt 实现软件启动界面动画
实现软件启动界面,用到QSplashScreen类。 效果 启动界面 描述 QSplashScreen小部件提供了一个可以在应用程序启动期间显示的启动画面。 启动画面通常是在应用程序启动时显示的小部件。启动画面通常用于启动时间较长的应用程序(例如需要花费一些时间来建…...

2000-2021年三批“智慧城市”试点名单匹配数据
2000-2021年三批“智慧城市”试点名单匹配数据 1、时间:2000-2021年 2、指标:行政区划代码、地区、所属省份、年份、智慧城市试点、最早试点年份 3、来源:住建部公布的三批“国家智慧城市名单” 4、说明:内含原始文件和匹配结…...

H5游戏分享-烟花效果
<!DOCTYPE html> <html dir"ltr" lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width" /> <title>点击夜空欣赏烟花</title> <sc…...

底层驱动day8作业
代码: //驱动程序 #include<linux/init.h> #include<linux/module.h> #include<linux/of.h> #include<linux/of_gpio.h> #include<linux/gpio.h> #include<linux/timer.h>struct device_node *dnode; //unsigned int gpiono; …...

openWRT SFTP 实现远程文件安全传输
🔥博客主页: 小羊失眠啦. 🔖系列专栏: C语言、Linux、 Cpolar ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 前言 1. openssh-sftp-server 安装2. 安装cpolar工具3.配置SFTP远程访问4.固定远程连接地址 前言 本次教程我…...

麒麟KYLINOS2303版本上使用KDE桌面共享软件
原文链接:麒麟KYLINOS2303版本上使用KDE桌面共享软件 hello,大家好啊,今天给大家推荐一个在麒麟KYLINOS桌面操作系统2303版本上使用KDE桌面共享软件的文章,通过安装KDE桌面共享软件,可以让远程vnc客户端连接访问本机桌…...

H5游戏源码分享-手机捉鬼游戏
H5游戏源码分享-手机捉鬼游戏 一款考验手速的游戏 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>手机捉鬼 微信HTML5在线朋友圈游戏</title><meta name&…...

vite中将css,js文件归类至文件夹
build: {chunkSizeWarningLimit: 1500,rollupOptions: {output: {// 最小化拆分包manualChunks(id) {if (id.includes(node_modules)) {return id.toString().split(node_modules/)[1].split(/)[0].toString()}},// 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]…...
【通信原理】第一章|绪论|信息度量和通信系统的性能指标
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 绪论 1. 信息和信息的度量 定义信息…...
基于STM32+OneNet设计的物联网智能鱼缸(2023升级版)
基于STM32+OneNet设计的智能鱼缸(升级版) 一、前言 随着物联网技术的快速发展,智能家居和智能养殖领域的应用越来越广泛。智能鱼缸作为智能家居和智能养殖的结合体,受到了越来越多消费者的关注。本项目设计一款基于STM32的物联网智能鱼缸,通过集成多种传感器和智能化控制模…...

NET-MongoDB的安装使用
一.下载 MongoDB 点击 Select package 选择自己所需版本后点击下载,本文选用Windows 6.0版本以上 二、配置MongoDB 在 Windows 上,MongoDB 将默认安装在 C:\Program Files\MongoDB 中。 将 C:\Program Files\MongoDB\Server\version_numbe…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...