【ccf-csp题解】第0次csp认证-第五题-I‘m stuck!-题解

news2024/11/24 5:20:02

题目描述

思路讲解

总体步骤

第一步:从起点正向搜索,能到达的地方(x,y),给st1[x][y]标记为true

第二步:从终点反向搜索,能到达的地方(x,y),给st2[x][y]标记为true

第三步:设终点位置为(tx,ty),若st1[tx][ty]为false,输出“I'm stuck!”,否则,转第四步

第四步:统计所有满足st1[x][y]&&!st2[x][y]的点(x,y),其数量即为满足条件的点数

反向搜索与实现方式

从终点出发进行反向搜索的时候,如何判断可以不可以让某一个点的st2数组标记为true?

如下图所示:

从终点查看反向是否能够到达左边的位置,其本质是看左边位置的点,能否顺着相反的方向到达终点!

那么如何表示这种相反的方向呢?

首先,利用我们常用的技巧,在开始设置方向数组dx和dy:

我们可以知道,下标为0代表上,下标为1代表右,下标为2代表下,下标为3代表左

所以当反向向左搜索时,我们要把代表左的“3”转换为代表右的“1”

同理当反向向右搜索时,我们要把代表右的“1”转换为代表左的“3”

同理当反向向上搜索时,我们要把代表上的“0”转换为代表下的“2”

同理当反向向下搜索时,我们要把代表下的“2”转换为代表上的“0”

如何实现这个转换?答案是:与2异或,即:

3^2=1   1^2=3   0^2=2   2^2=0

那么就可以得到反向搜索的dfs代码了:

check函数的实现

check函数用于判断从某一个点(a,b)出发,是否能沿方向k走一步,与上面相同,k=0代表向上,以此类推...

由题意,实现如下,非常容易理解

满分代码

#include<iostream>
using namespace std;
const int N=55;
char g[N][N];
bool st1[N][N],st2[N][N];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int n,m;

bool check(int a,int b,int k)
{
	if(g[a][b]=='+'||g[a][b]=='S'||g[a][b]=='T')return true;
	if(g[a][b]=='-'&&k%2==1)return true;
	if(g[a][b]=='|'&&k%2==0)return true;
	if(g[a][b]=='.'&&k==2)return true;
	return false;
}

void dfs1(int x,int y)//从起点向其它点遍历 
{
	st1[x][y]=true;
	for(int i=0;i<4;i++)
	{
		int ax=x+dx[i],ay=y+dy[i];
		if(ax<0||ax>=n||ay<0||ay>=m||g[ax][ay]=='#'||st1[ax][ay])continue;
		if(check(x,y,i))dfs1(ax,ay);
	}
}

void dfs2(int x,int y)//从终点反向遍历至其它点
{
	st2[x][y]=true;
	for(int i=0;i<4;i++)
	{
		int ax=x+dx[i],ay=y+dy[i];
		if(ax<0||ax>=n||ay<0||ay>=m||g[ax][ay]=='#'||st2[ax][ay])continue;
		if(check(ax,ay,i^2))dfs2(ax,ay);
	}
} 
int main()
{
	cin>>n>>m;
	int tx,ty;
	for(int i=0;i<n;i++)cin>>g[i];
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		{
			if(g[i][j]=='S')dfs1(i,j);
			else if(g[i][j]=='T')
			{
				tx=i,ty=j;
				dfs2(tx,ty);
			}
		}
	if(!st1[tx][ty])puts("I'm stuck!");
	else
	{
		int res=0;
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
				if(st1[i][j]&&!st2[i][j])res++;
		cout<<res;
	}
	return 0;
}

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

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

相关文章

【LeetCode】剑指 Offer <二刷>(7)

目录 题目&#xff1a;剑指 Offer 14- I. 剪绳子 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 14- II. 剪绳子 II - 力扣&#xff08;…

基于YOLOv8+PyQt5实现的共享自行车识别检测系统,含数据集+模型+精美GUI界面(可用于违规停放检测告警项目)

系列文章目录 文章目录 系列文章目录前言欢迎来到我的博客&#xff01;我很高兴能与大家分享关于基于YOLOv8的共享自行车识别检测&#xff0c;违规停放告警系统的内容。 一、系统特点7. 带有训练部分标注好的数据集&#xff0c;训练集、验证集 二、环境配置2.anaconda环境导入p…

阿里内部绝密资料——亿级并发系统架构设计(2023版)

俗话说&#xff1a;罗马不是一天建成的&#xff0c;系统的设计当然也是如此。 从原来谁都不看好的淘宝到现在的电商巨头&#xff0c;展现的不仅仅是一家互联网巨头的兴起&#xff0c;也是国内互联网行业迎来井喷式发展的历程&#xff0c;网络信号从 2G 发展到现在的 5G 通信&a…

uniapp移动端地图,点击气泡弹窗并实现精准定位

记录移动端地图map组件的使用 需求记录&#xff1a; 移动端地图部分需要展示两个定位点&#xff0c;上报点及人员定位点。通过右上角的两个按钮实现地图定位。点击对应定位气泡&#xff0c;弹出定位点的信息。 效果图如下&#xff1a; map在nvue中的使用。直接用nvue可以直接…

Python的io模块

io 模块提供了 Python 用于处理各种 I/O 类型的主要工具。三种主要的 I/O类型分别为: 文本 I/O, 二进制 I/O 和 原始 I/O。 io.open() 是内置的 open() 函数的别名. 语法&#xff1a; open(file,moder,buffering-1,encodingNone,errorsNone,newlineNone,closefdTrue,openerN…

Python基础教程:进程的调度

前言 嗨喽~大家好呀&#xff0c;这里是小曼呐 ❤ ~! 要想多个进程交替运行&#xff0c;操作系统必须对这些进程进行调度&#xff0c; 这个调度也不是随即进行的&#xff0c;而是需要遵循一定的法则&#xff0c;由此就有了进程的调度算法。 一、先来先服务调度算法 先来先服…

【IT资讯速递】清华大学推出 D-Bot,用 AI 大模型协助管理数据库;ChatGPT 与 Stack Overflow 的对决;免费在线AI工具LeiaPix:一键将图片转3D动画

2023年8月17日 星期四 癸卯年七月初二 第000004号 本文收录于IT资讯速递专栏,本专栏主要用于发布各种IT资讯&#xff0c;为大家可以省时省力的就能阅读和了解到行业的一些新资讯 IT资讯速递 一、清华大学推出 D-Bot&#xff0c;用 AI 大模型协助管理数据库二、OpenAI宣布使用G…

C语言文件读写常用函数

文章目录 1. fopen函数2. fclose函数3. fgetc函数4. fgets函数5. fputc函数6. fputs函数7. fprintf函数8. fscanf函数9. fseek函数10. ftell函数 1. fopen函数 返回值&#xff1a;文件指针&#xff08;FILE*&#xff09;参数&#xff1a;文件名&#xff08;包括文件路径&#…

用半天时间从零开始复习前端之html

目录 前言 科班生的标配&#xff1a;半天听完一门标记型语言 准备工作 webstorm2022 webstrom 第一个html页面 body h系列标签 行标签和块标签 列表标签 表格标签&#xff08;另起一篇&#xff09; 万能的input 1.快速生成多个标签 2.同时选中多个 前言 科班生的标…

算法通关村十四关:青铜-堆结构

青铜挑战-堆结构 堆结构&#xff1a;重要的基础数据结构 明确什么类型的题目可以用堆&#xff0c;以及如何用堆来解决 堆的构造和维护过程都非常复杂 1.堆的概念与特征 1.1基本概念 堆&#xff1a;是将一组数据按照 完全二叉树 的存储顺序&#xff0c;将数据存储在一个一…

RHCA之路---EX280(9)

RHCA之路—EX280(9) 1. 题目 Scale the application greeter in the project samples to a total of 5 replicas 2. 解题 2.1 切换项目 [rootmaster ex280]# oc project samples Now using project "samples" on server "https://master.lab.example.com&qu…

The WebSocket session [x] has been closed and no method (apart from close())

在向客户端发送消息时&#xff0c;session关闭了。 不管是单客户端发送消息还是多客户端发送消息&#xff0c;在发送消息之前判断session 是否关闭 使用 isOpen() 方法

简单的爬虫代码 爬(豆瓣电影)

路漫漫其修远兮&#xff0c;吾将上下而求索 这次写一个最简单的python爬虫代码&#xff0c;也是大多教程第一次爬取的&#xff0c;代码里面有个别的简单介绍&#xff0c;希望能加深您对python爬虫的理解。 本次爬取两个网页数据 一 爬取的网站 豆瓣电影 爬取网页中的&#…

【无标题】can中继器 can隔离器 本安型CAN中继器在无轨胶轮车电控箱和防爆变频器中的应用

随着科学技术的不断发展和社会的不断进步,煤炭资源之于人类显得更加的重要,近年来,煤矿企业进一步发展,为我国的经济带来巨大的好处。在煤矿的运输过程中,无轨式脚轮车的应用是非常广泛的,它具有灵活、快速、激动、安全等特点,极大的提高了煤炭的运输效率。目前,在无轨胶轮车的…

问道管理:存款利率多次调降后,为何银行存款成本率不降反升?

存款本钱是银行最首要的资金本钱&#xff0c;2022年以来&#xff0c;人民币存款利率阅历了5次会集下调&#xff0c;但上市银行发布的2023年半年报显现&#xff0c;存款均匀本钱率不降反升。 2023年上半年&#xff0c;42家A股上市银行存款均匀本钱率均值为2.18%&#xff0c;较2…

服务端请求伪造(SSRF)及漏洞复现

文章目录 渗透测试漏洞原理服务端请求伪造1. SSRF 概述1.1 SSRF 场景1.1.1 PHP 实现 1.2 SSRF 原理1.3 SSRF 危害 2. SSRF 攻防2.1 SSRF 利用2.1.1 文件访问2.1.2 端口扫描2.1.3 读取本地文件2.1.4 内网应用指纹识别2.1.5 攻击内网Web应用 2.2 SSRF 经典案例2.2.1 访问页面2.2.…

QLoRA:量化LLM的高效微调策略与实践

如果你对这篇文章感兴趣&#xff0c;而且你想要了解更多关于AI领域的实战技巧&#xff0c;可以关注「技术狂潮AI」公众号。在这里&#xff0c;你可以看到最新最热的AIGC领域的干货文章和案例实战教程。 一、前言 在大型语言模型&#xff08;LLM&#xff09;领域&#xff0c;微…

Android大厂需要刷的(999道)面试题

想必大家都在为今年的金九银十做准备&#xff0c;今年也是最为艰难的一年。作为程序员从未感觉到如此艰难&#xff0c;身边不是被辞退就是找不到工作。先不说2023年应届生毕业即失业&#xff0c;作为开发15年的老Android程序员&#xff0c;现在也在和300个人挣一个岗位。 肉少…

MySQL大数据量高速迁移,500GB只需1个小时

在上篇「快、准、稳的实现亿级别MySQL大表迁移」的文章中&#xff0c;介绍了NineData在单张大表场景下的迁移性能和优势。但在大部分场景中&#xff0c;可能遇到的是多张表构成的大数据量场景下的数据搬迁问题。因为搬迁数据量较大&#xff0c;迁移的时长、稳定性及准确性都受到…

Maven编译java及解决程序包org.apache.logging.log4j不存在问题

1、首先新建一个文件夹&#xff0c;比如hello Hello里新建pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…