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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能