【寒假每日一题】AcWing 4510. 寻宝!大冒险!

简介: 目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解

一、题目

1、原题链接

4510. 寻宝!大冒险! - AcWing题库


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)与藏宝图 BB 左下角 (0,0) 相对应,即满足:

对 B 上任意一处坐标 (i,j)(0≤i,j≤S),都有 A[x+i][y+j]=B[i][j]。

当上述条件满足时,我们就认为藏宝图 B 对应着绿化图 A 中左下角为 (x,y)、右上角为 (x+S,y+S) 的区域。

实际上,考虑到藏宝图仅描绘了很小的一个范围,满足上述条件的坐标 (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]一行最后输入。

输出格式

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

数据范围

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

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

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

输入样例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) 处对应,则藏宝图右上角会超出绿化图边界,对应不成功。


二、解题报告

思路来源:y总,相亲的时候,月薪8000体制内和月薪2万程序员该选哪个呢?每日一题_哔哩哔哩_bilibili

y总yyds


1、思路分析

1)枚举每棵树的位置,针对每棵树的位置,使其按题目要求,作为B[0][0],依据题意来判断是否满足要求,统计出满足的个数,输出,即为所求。

2)判断是否满足时,可以依次枚举每棵树,作为B[0][0],然后将B中的每个点与A中对应范围内的每个点依次进行判断是否值相等(可以先将对应范围的区域“剪裁”下来作为一个数组(开一个和B一样大的数组,来存储A中对应范围的情况--是否有树),然后用B来与其进行逐个点的比较),即可;也可以先统计出B中树的数目,然后再在A中对应的B范围内的树来依次判断B中对应的点是否也是树,如果满足此条件,而且A中对应的B范围内的树的数量和输入的B中树的数量相等,可以判定这个树的坐标作为B[0][0]满足题目要求。


2、时间复杂度

时间复杂度为O(n^2)


3、代码详解

#include <iostream>

using namespace std;

typedef long long LL;

#define x first

#define y second

pair<int,int> p[1010];

int B[55][55];

int main()

{   int  n,S;

   LL L;

   cin>>n>>L>>S;

   for(int i=0;i<n;i++){

    cin>>p[i].x>>p[i].y;

}

int treeB=0; //记录B中树的数量

for(int i=S;i>=0;i--){

 for(int j=0;j<=S;j++){

  cin>>B[i][j];

  if(B[i][j])

    treeB++;

 }

}

int ans=0;   //记录结果

for(int i=0;i<n;i++){

 //记录当前遍历的树的坐标

 int nx=p[i].x,ny=p[i].y;

    //BSx,BSy代表藏宝图对应在绿化图上的B[S][S]的横纵坐标

 int BSx=p[i].x+S,BSy=p[i].y+S;

 //如果B[S][S]超出了绿化图的范围不操作

 if(BSx>L||BSy>L) continue;

 int numt=0; //记录绿化图中对应藏宝图范围内的树的总数

 bool flag=true;   //记录是否A中对应范围内的树,在B中都有对应

 for(int j=0;j<n;j++){

  //如果树的坐标恰好在藏宝图的范围中

  if(p[j].x>=nx&&p[j].x<=BSx&&p[j].y>=ny&&p[j].y<=BSy){

   //判断这棵树在输入的B中是否存在

   if(B[p[j].x-nx][p[j].y-ny])

      numt++;

   else flag=false;

  }

 }

 if(numt==treeB&&flag)  ans++;

}

cout<<ans;

return 0;

}

/*注: 两个范围内树的数量相等,不一定能够匹配

   因为树的分布可能不同,所以只有保证在A中对应藏宝图范围内的每棵树,在输入的B中对应位置也是树

   这就保证了B中一定包含了绿化图对应范围内的树,但是也可能在此之上还有别的树,因为我们是用A中

   对应范围内的每棵树来与B范围内相应的树进行判断,说明B中树在满足此条件后,还有其他树,所以在

   此条件下保证两个范围内的树的总数一致,就能保证B中的树一定全都是A中对应范围中的树,也就说明

  了满足上述条件,这个树点就满足题目要求。

  */


目录
相关文章
|
监控 关系型数据库 MySQL
《MySQL 简易速速上手小册》第7章:MySQL监控和日志分析(2024 最新版)
《MySQL 简易速速上手小册》第7章:MySQL监控和日志分析(2024 最新版)
188 3
|
15天前
|
人工智能 云计算
和五所高校一起,我们共同打造了一门AI课程!丨云工开物
9月1日,阿里云联合多所高校推出的「动手学AI:人工智能通识与实践」课程正式开放。课程涵盖理论与实践,支持多专业定制,助力高校AI人才培养。
|
XML JSON Java
Spring Boot 返回 XML 数据,一分钟搞定!
Spring核心技术 67 篇文章13 订阅 订阅专栏 Spring Boot 返回 XML 数据,前提必须已经搭建了 Spring Boot 项目,所以这一块代码就不贴了,可以点击查看之前分享的 Spring Boot 返回 JSON 数据,一分钟搞定!。
Spring Boot 返回 XML 数据,一分钟搞定!
|
9月前
|
弹性计算 运维 监控
阿里云服务诊断工具评测报告
阿里云服务诊断工具评测报告
247 78
|
SQL 关系型数据库 MySQL
使用关系型数据库事务的例子
【5月更文挑战第12天】本文介绍了设置MySQL事务的三种方式:全局、当前session和下一个事务,并提供了示例代码展示如何开始事务和设置隔离级别。还简述了引擎设置和数据源DSN格式。最后,讨论了SQL优化策略,包括选择合适的存储引擎、优化字段数据类型、建立索引、避免全表扫描等。
380 4
使用关系型数据库事务的例子
|
8月前
|
机器学习/深度学习 存储 人工智能
《脉动阵列:AI硬件加速的“秘密武器”》
脉动阵列(Systolic Array)是一种高效的并行计算架构,灵感源自人体血液循环系统。它通过网格排列的处理单元(PE),以同步并行方式处理数据,尤其在矩阵乘法和卷积运算中表现出色,极大提升了AI计算效率。其优势包括降低内存带宽需求、高运算吞吐率和设计简洁,但也面临灵活性有限、全局同步难等挑战。尽管如此,脉动阵列仍为AI硬件加速提供了重要支持,推动了人工智能技术的发展。
642 14
|
1月前
|
存储 缓存 固态存储
固态硬盘为什么会出现故障?
近年来,固态硬盘(SSD)因速度快广受用户青睐,但使用中也出现故障频发的问题,如开机异常、数据丢失、系统卡顿等。本文解析SSD故障原因,包括寿命限制、主控设计缺陷、电压波动、固件问题等,并提供数据抢救方法与延长SSD寿命的实用技巧,助你避免数据丢失风险。
|
9月前
|
分布式计算 DataWorks 大数据
DataWorks
DataWorks 是阿里云推出的一站式智能大数据开发与治理平台,拥有 15 年大数据建设经验,提供 ETL 开发、数据分析及数据资产治理功能,支持 MaxCompute、EMR、Hologres、Flink 和 PAI 等多种计算服务,助力企业实现数据全生命周期管理和价值挖掘。
|
6月前
|
运维 监控 数据可视化
Hyper-V的哪些性能?使其成为企业构建云平台和虚拟化环境的首选
Hyper-V凭借高效性、灵活性、高可用性及管理简便性等优势,成为企业构建云平台和虚拟化环境的首选。其微内核架构、硬件辅助虚拟化技术和动态内存管理提升了性能与资源利用率;支持多操作系统和硬件平台,具备故障转移、实时迁移功能,确保业务连续性;提供可视化管理工具和PowerShell脚本自动化,简化管理流程;与Windows Server及Azure无缝集成,降低硬件、运维和能源成本。