[洛谷]P1003 铺地毯
程序员文章站
2022-07-13 11:30:31
...
算法标签
题目简叙
思路
我们理解一下这道题
1.参数n 总共有N个地毯 2.参数a b 表示以(a,b)为起点 3.参数g k 表示以(a,b)为起点,(a+g)X(b+k)的范围被新的地毯覆盖
我们需要理解到,不论前面的地毯姿势多么奇异,只要后面的地毯覆盖到了点(x,y)那么我们就得返回后面地毯的坐标
这种方式下,我们只需要从后往前推范围即可,从第n到第1个地毯,如果被覆盖就直接返回答案
那么,怎么判断点(x,y)是否被覆盖呢?
首先我刚开始的时候直接想错了,我想给一个BOOL的二维数组,然后(a+g)X(b+k)直接覆盖,然后检查是否覆盖了(x,y)点
但事实上,我们可以直接依靠a b g k四个点的数据来判断
即:(x in (range of a,a+g) && y in(range of b,b+k))
那么我们就可以判断点(x,y)在目标范围内,逆序检查的情况下直接返回
代码
#include<iostream>
using namespace std;
const int N=1e4+10;
int n;
int a[N],b[N],g[N],k[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>a[i]>>b[i]>>g[i]>>k[i];//读入数据
int x,y;x=y=0;
int res=-1;//默认返回-1
for(int i=n-1;i>=0;i--)
{
cin>>x>>y;//读入目标点
if(x>=a[i]&&x<=a[i]+g[i]&&y>=b[i]&&y<=b[i]+k[i]){res=i+1;break;}//判定范围
}
cout<<res;//返回答案
return 0;
}
AC截图
上一篇: 洛谷 P1003 铺地毯
下一篇: 八阿哥-酷-第四弹