地毯问题
链接:https://ac.nowcoder.com/acm/problem/16593
来源:牛客网
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n张地毯,编号从1到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
这个地毯问题,只要把它转化为一个范围问题,就很简单了,设定数组来限制出每个矩形的x,y的范围,再从上往下比较就可以得出答案
我是想着弄个简单数据结构,限制出x,y的范围那,这个基本解决了,再用坐标来一个个比较就出来了;
#include <iostream>
using namespace std;
struct position
{
int x[2];
int y[2];
};
bool data(int m,int x1,int x2)
{
if(m>=x1&&m<=x2 )
return true;
else return false;
}
int main()
{
int n,i,x,y;
scanf("%d",&n);
position a[n];
for(i=0;i<n;i++)
{
scanf("%d%d%d%d",&a[i].x[0],&a[i].y[0],&x,&y);
a[i].x[1]=a[i].x[0]+x;
a[i].y[1]=a[i].y[0]+y;
}
scanf("%d%d",&x,&y);
int t=-1;
for(i=n-1;i>=0;i--)
{
if(data(x,a[i].x[0],a[i].x[1])&&data(y,a[i].y[0],a[i].y[1]))
{
t=i; break;
}
}
if(t!=-1)
{
t=t+1;
printf("%d",t);
}
else printf("-1");
return 0;
}