欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[洛谷]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 铺地毯

相关标签: 洛谷