铺地毯
该题目对时间复杂度要求较高,使用一般的双层循环构造成的二维数组会导致超时
如图,除第一行与最后一行,其余每行都分别代表这此地毯的坐标和长宽,
可将第1行和倒数第1行之间的部分抽象成一个二维数组,可将该数组进行录入和稍加调整
如图有abcd四点,令图中的c=c+a,d=d+b(c,d为宽度或长度,即a+c为地毯区域中x的最大值,b+d为区域中y的最大值)
a<= x <=c+a , b<= y <=d+b
此时靠a,b,c,d便可以明确的划分出该层地毯的范围
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
cin >> n;
int a[10000][5];
for (int i=1;i<=n;i++)//将n个地毯的范围值分别录入
{
cin >> a[i][1] >>a[i][2] >>a[i][3] >>a[i][4];
a[i][3]+=a[i][1];
a[i][4]+=a[i][2];
}
int xi,yi;
cin >> xi >> yi;
for (i=n;i>0;i--)//检查最终输入的点是否在第n个地毯上,由于第n个地毯最后叠放上去,故先从第n个地毯开始检查
{
if(xi>=a[i][1]&&xi<=a[i][3]&&yi>=a[i][2]&&yi<=a[i][4])
{
cout << i;break;
}
}
if(i==0) cout << -1;//i=0说明遍历一轮了还没有找到(xi,yi)的位置返回-1
return 0;
}