这道题我进坑了,我看到这个题的第一反应就是定义一个二维数组模拟坐标系,按顺序把地毯数存进覆盖的坐标中。然后我就看到内存达到128000KB,下载输入测试文件,发现了10000个地毯数据QAQ~!!
刚开始的代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int array[10001][10001]={0};
int main ()
{
int x,y,a,b,g,h;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d %d %d",&a,&b,&g,&h);
for(int j=a;j<=a+g;j++)//把地毯覆盖的点赋值
{
for(int k=b;k<=b+h;k++)
{
array[j][k]=i;
}
}
}
scanf("%d %d",&x,&y);
if(array[x][y]==0)
{
printf("-1");
}else printf("%d",array[x][y]);
return 0;
}
然后我就去看下大佬是怎么解决的,瞬间就明白了,微笑,默叹,以为妙绝。
正确思路应该是这样的,定义一个数组,按顺序保存地毯四个角的坐标,再逆序判断给定点是否在地毯内就行了。
改写代码如下,顺利AC,收获挺大的。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int a[10001][5];
int main()
{
int x,y,n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d %d %d",&a[i][1],&a[i][2],&a[i][3],&a[i][4]);
a[i][3]+=a[i][1];
a[i][4]+=a[i][2];
}//数组只是用来记录第i个地毯的四个点的坐标
scanf("%d %d",&x,&y);
for(int i=n;i>=1;i--)//逆序判断地毯是否覆盖(x,y)
{
if(a[i][1]<=x&&a[i][2]<=y&&a[i][3]>=x&&a[i][4]>=y)
{printf("%d",i);
return 0;
}
}
printf("-1");//没有则输出-1
return 0;
}