CCF I’m stuck(满分代码 + 解题思路 + 技巧总结) 201312-5

2023-11-05 15:50

本文主要是介绍CCF I’m stuck(满分代码 + 解题思路 + 技巧总结) 201312-5,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

技巧总结

  • 数组中上下左右的移动可以使用偏移量数组,方便操作
  • 当要遍历数组中的点能否到达点T时,可以通过从点T反向遍历,先反向判断后再移动,遍历到的所有点即正向可达

在这里插入图片描述


解题思路

题目中需要找满足 (从起点可以到达该点 && 从该点不能到达终点)这两个条件的点的个数
所以可以开设两个数组记录是否分别满足上述两个条件
st1数组记录从起点可以遍历到的所有点
st2数组记录从终点可以反向遍历到的所有点

反向遍历就是假如你要从(x, y)走到(a, b),你先判断从(a, b)能否走到(x, y),若能,则从(x, y)走到(a,b)
然后同时遍历两个数组,计数满足上述条件点的个数
如果st1中显示从起点无法到达终点则输出“I’m stuck!"

代码实现

#include <iostream>
#include <unordered_map>
#include <cstring>using namespace std;const int N = 60;
typedef pair <int, int> PII;char g[N][N];int n, m;
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};//st1记录s能够到达的点,st2记录t能到达的点
bool st1[N][N];
bool st2[N][N];void dfs1(int a, int b) //从S正向遍历
{//先预定义每一种符号有哪些移动方向int l = 0, r = 0;if (g[a][b] == '+' || g[a][b] == 'T' || g[a][b] == 'S') l = 0, r = 4;if (g[a][b] == '-') l = 2, r = 4;if (g[a][b] == '|') l = 0, r = 2;if (g[a][b] == '.') l = 1, r = 2; st1[a][b] = true;for (int i = l; i < r; i ++){int x = a + dx[i], y = b + dy[i];if (x < 1 || x > n || y < 1 || y > m || st1[x][y] || g[x][y] == '#') continue;dfs1(x, y);}return ;
}void dfs2(int a, int b) //从T反向遍历
{st2[a][b] = true;for (int i = 0; i < 4; i ++){int x = a + dx[i], y = b + dy[i];if (x < 1 || x > n || y < 1 || y > m || st2[x][y] || g[x][y] == '#') continue;if (g[x][y] == '.' && i != 0) continue; //.只能位于该点上方才合理,才能从.到达该点if (g[x][y] == '-' && i != 2 && i != 3) continue;//.只能位于该点的左右才合理,才能从-到达该点if (g[x][y] == '|' && i != 0 && i != 1) continue;//.只能位于该点的上下才合理,才能从|到达该点dfs2(x, y);}return ;
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i ++){scanf("%s", g[i] + 1);}PII bn, ed;for (int i = 1; i <= n; i ++){for (int j = 1; j <= m; j ++){if (g[i][j] == 'S') bn = {i, j}; if (g[i][j] == 'T') ed = {i, j};}}memset(st1, false, sizeof(st1));memset(st2, false, sizeof(st2));dfs1(bn.first, bn.second);dfs2(ed.first, ed.second);int res = 0;if (st1[ed.first][ed.second]) //S可以到达T{for (int i = 1; i <= n; i ++){for (int j = 1; j <= m; j ++){if (st1[i][j] && !st2[i][j]) res ++; // S可以到达,T不能到达的点即为答案}}cout << res;}else cout << "I'm stuck!";return 0;
}

这篇关于CCF I’m stuck(满分代码 + 解题思路 + 技巧总结) 201312-5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350890

相关文章

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是