CCF-CSP真题202206-2《寻宝!大冒险!》

2024-03-28 06:52

本文主要是介绍CCF-CSP真题202206-2《寻宝!大冒险!》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目背景

暑假要到了。可惜由于种种原因,小 P 原本的出游计划取消。失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期……直到……

某天,小 P 获得了一张神秘的藏宝图。

问题描述

西西艾弗岛上种有 n 棵树,这些树的具体位置记录在一张绿化图上。
简单地说,西西艾弗岛绿化图可以视作一个大小为 (L+1)×(L+1) 的 01 矩阵 A,
地图左下角(坐标 (0,0))和右上角(坐标 (L,L))分别对应 A[0][0] 和 A[L][L]。
其中 A[i][j]=1 表示坐标 (i,j) 处种有一棵树,A[i][j]=0 则表示坐标 (i,j) 处没有树。
换言之,矩阵 A 中有且仅有的 n 个 1 展示了西西艾弗岛上 n 棵树的具体位置。

传说,大冒险家顿顿的宝藏就埋藏在某棵树下。
并且,顿顿还从西西艾弗岛的绿化图上剪下了一小块,制作成藏宝图指示其位置。
具体来说,藏宝图可以看作一个大小为 (S+1)×(S+1) 的 01 矩阵 B(S 远小于 L),对应着 A 中的某一部分。
理论上,绿化图 A 中存在着一处坐标 (x,y)(0≤x,y≤L−S)与藏宝图 B 左下角 (0,0) 相对应,即满足:
对 B 上任意一处坐标 (i,j)(0≤i,j≤S),都有 A[x+i][y+j]=B[i][j]。
当上述条件满足时,我们就认为藏宝图 B 对应着绿化图 A 中左下角为 (x,y)、右上角为 (x+i,y+j) 的区域。

实际上,考虑到藏宝图仅描绘了很小的一个范围,满足上述条件的坐标 (x,y) 很可能存在多个。
请结合西西艾弗岛绿化图中 n 棵树的位置,以及小 P 手中的藏宝图,判断绿化图中有多少处坐标满足条件。

特别地,藏宝图左下角位置一定是一棵树,即 A[x][y]=B[0][0]=1,表示了宝藏埋藏的位置。

输入格式

从标准输入读入数据。

输入的第一行包含空格分隔的三个正整数 n、L 和 S,分别表示西西艾弗岛上树的棵数、绿化图和藏宝图的大小。

由于绿化图尺寸过大,输入数据中仅包含 n 棵树的坐标而非完整的地图;即接下来 n 行每行包含空格分隔的两个整数 x 和 y,表示一棵树的坐标,满足 0≤x,y≤L 且同一坐标不会重复出现。

最后 (S+1) 行输入小 P 手中完整的藏宝图,其中第 i 行(0≤i≤S)包含空格分隔的 (S+1) 个 0 和 1,表示 B[S−i][0]⋯B[S−i][S]。
需要注意,最先输入的是 B[S][0]⋯B[S][S] 一行,B[0][0]⋯B[0][S] 一行最后输入。

输出格式

输出到标准输出。

输出一个整数,表示绿化图中有多少处坐标可以与藏宝图左下角对应,即可能埋藏着顿顿的宝藏。

样例 1 输入

5 100 2
0 0
1 1
2 2
3 3
4 4
0 0 1
0 1 0
1 0 0

样例 1 输出

3

样例 1 解释

绿化图上 (0,0)、(1,1) 和 (2,2) 三处均可能埋有宝藏。

样例 2 输入

5 4 2
0 0
1 1
2 2
3 3
4 4
0 0 0
0 1 0
1 0 0

样例 2 输出

0

样例 2 解释

如果将藏宝图左下角与绿化图 (3,3) 处对应,则藏宝图右上角会超出绿化图边界,对应不成功。

子任务

40% 的测试数据满足:L≤50;

70% 的测试数据满足:L≤2000;

全部的测试数据满足:n≤1000、L≤10^{9} 且 S≤50。

提示

实际测试数据中不包括答案为 0 的用例。

思路: 

1、查看测试数据可知遍历绿化图肯定会超时,因为最大可达10的9次方,观察题目发现藏宝图左下角位置一定是一棵树,即 A[x][y]=B[0][0]=1,表示了宝藏埋藏的位置,而绿化图中树的个数最多只有1000棵,可在满足藏宝图左下角的而情况下遍历绿化图中的每一棵树来进行判断。

2、若藏宝图中有一个位置的01情况与绿化图中不一致,则直接遍历下一棵树。

代码实现: 

#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;int main() {int n, L, S;cin >> n >> L >> S;map<pair<int,int>, int>Tree;vector<vector<int>>Graph;for (int i = 0; i < n; ++i) {             //利用一个有序哈希表来存储绿化图中哪些点有坐标int x, y;                             cin >> x >> y;++Tree[{x,y}];                        //其中哈希表的key为两个坐标,value++使其等于1表示该点有树}for (int i = 0; i <= S; ++i) {            //藏宝图坐标的输入vector<int>tmp;for (int j = 0; j <= S; ++j) {int x;cin >> x;tmp.push_back(x);}Graph.push_back(tmp);                 }reverse(Graph.begin(), Graph.end());       //题目说明藏宝图的最后一次输入是第一行,所以进行一次反转int res = 0;//测试数据L最大可达10的9次方,遍历绿化图显然不切合实际,题目说明藏宝图左下角位置一定是一棵树,//即Graph[0][0]=1,表示了宝藏埋藏的位置,因此以绿化图的每一棵树作为藏宝图左下角为起点,遍历藏宝图来进行判断,因为藏宝图的大小S最大也为50for (auto& s : Tree) {                                         //表示以绿化图的每一棵树坐标开始                  if (s.first.first + S > L || s.first.second + S > L)       //绿化图起始坐标加上藏宝图大小越界绿化图则直接continuecontinue;else {int i, j;bool flag = true;                                       //此标志位是为了跳出两层循环for (i = 0; i <= S; ++i) {                              //i是藏宝图横坐标for (j = 0; j <= S; ++j) {                          //j是藏宝图纵坐标//遍历到的坐标藏宝图和绿化图表示的不一样则直接break,表示以绿化图这棵树为开始不符合要求,需要判断其他树//s.first.first表示绿化图中树的横坐标,s.first.second表示绿化图中树的纵坐标if (Graph[i][j] != Tree[{s.first.first + i, s.first.second + j}]) {flag = false;break;}}if (!flag)        //跳出两层循环遍历其他树break;}if (i > S)            //i越界则j一定越界,表示以绿化图这棵树为起点满足要求,结果++++res;}}cout << res << endl;
}

这篇关于CCF-CSP真题202206-2《寻宝!大冒险!》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

ccfcsp-202206(1、2、3)

202206-1 归一化处理 #include <bits/stdc++.h>using namespace std;int main() {int n;cin >> n;vector<double> vec(n);double ave = 0;for(int i = 0; i < n; i++){cin >> vec[i];ave += vec[i];}ave /= n;double va

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

华为OD机试真题-学生方阵-2024年OD统一考试(E卷)

题目描述 学校组织活动,将学生排成一个矩形方阵。 请在矩形方阵中找到最大的位置相连的男生数量。这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的。 注:学生个数不会超过10000 输入描述 输入的第一行为矩阵的行数和列数, 接下来的 n行为矩阵元素,元素间用""分隔。 输出描述 输出一个整数,表示矩阵中最长的位

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

CCF推荐C类会议和期刊总结(计算机网络领域)

CCF推荐C类会议和期刊总结(计算机网络领域) 在计算机网络领域,中国计算机学会(CCF)推荐的C类会议和期刊为研究者提供了广泛的学术交流平台。以下是对所有C类会议和期刊的总结,包括全称、出版社、dblp文献网址以及所属领域。 目录 CCF推荐C类会议和期刊总结(计算机网络领域) C类期刊 1. Ad Hoc Networks 2. CC 3. TNSM 4. IET Com

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

CSP-J基础之cmath常见函数

文章目录 前言1. **`sin` 函数**2. **`cos` 函数**3. **`exp` 函数**4. **`log` 函数**5. **`fabs` 函数**6. **`pow` 函数**7. **`sqrt` 函数**8. **`ceil` 函数**9. **`floor` 函数** 总结 前言 在计算机科学与编程中,数学函数是解决各种计算问题的基础工具。C++标准

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

CSP-J选择题 - 排列组合

排列问题:有5名学生参加比赛,要求排成一排拍照,有多少种不同的排列方式?组合问题:从10本书中选出3本书送给朋友,有多少种不同的选择方式?排列问题:一个教室有7个座位,5个学生需要坐下,有多少种不同的排列方式?组合问题:从12个人中选出4个人组成一个团队,有多少种不同的方式?排列问题:一个密码由4个字母组成,字母可以重复使用,有多少种不同的排列组合?组合问题:从8个不同颜色的球中选出3个,不考虑顺