//我的思路是建立一个结构体数组,结构体包含的信息有每个地毯的左下角坐标,x轴的长度,y轴的长度,以及右上角的坐标(由前面的信息求出),其实用结构体只是让每个地毯的信息更紧凑而已,更加明了,不用也行。确定了一个矩形的左下角坐标和右上角坐标就可以确定一个矩形了。通过这两个点即可确定另外某个点是否在矩形内部。由题意求最上面的一个地毯,所以一个小技巧是倒序遍历数组,找到了符和条件的矩形即停止,能节省时间
下面是我AC的代码:
#include<stdio.h>
struct point {
int x1; //左下角的横坐标
int y1; //左下角的纵坐标
int xd; //x轴的长度
int yd; //y轴的长度
int x2; //右上角的横坐标
int y2; //右上角的纵坐标
}p[10005]; //结构体数组
int main() {
int n, i, x0, y0, ans;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d%d%d%d", &p[i].x1, &p[i].y1, &p[i].xd, &p[i].yd);
p[i].x2 = p[i].x1 + p[i].xd; //求出该矩形右上角的坐标
p[i].y2 = p[i].y1 + p[i].yd;
}
ans = -1; //ans初始化为-1
scanf("%d%d", &x0, &y0);
for(i = n - 1; i >= 0; i--)
if (x0 >= p[i].x1 && x0 <= p[i].x2 && y0 >= p[i].y1 && y0 <= p[i].y2) { //输入的横、纵坐标位于两点横纵坐标之间,就满足题意
ans = i + 1; //因为地毯编号从1开始,而数组下标从0开始,所以加1
break; //满足题意即跳出循环
}
printf("%d", ans);
return 0;
}