思路分析
1.
输入处理:程序首先读取地毯的数量n。然后依次读取每张地毯的信息,包括左下角坐标(a, b)和尺寸(c, d),并存储在数组中。
3.
检查覆盖:
- 从最后一张地毯开始,依次向前检查每张地毯是否覆盖点(x, y)。
- 检查条件是:x在地毯的x范围内(a[i] <= x <= a[i] + c[i])且y在地毯的y范围内(b[i] <= y <= b[i] + d[i])。
4.
输出结果:
- 如果找到覆盖点(x, y)的地毯,输出该地毯的编号i。
关键点
- 从后向前检查:因为后铺的地毯会覆盖前面的地毯,所以从最后一张地毯开始检查,确保找到的是最上面的地毯。
- 边界条件:在地毯的边界和顶点上的点也算被覆盖,因此检查条件包括等号
#include<bits/stdc++.h>
#define f(i,s,e) for(int i = s; i <= e; i++) // 定义一个宏,用于简化for循环
#define ll long long
using namespace std;
const int N = 1e4+10, inf = 0x3f3f3f3f;
int n, a[N], b[N], c[N], d[N]; // 定义数组存储地毯信息
int main() {
cin >> n; // 读取地毯的数量
f(i, 1, n) {
// 读取每张地毯的信息:左下角坐标(a, b)和尺寸(c, d)
scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);
}
int x, y;
cin >> x >> y; // 读取要查询的点的坐标(x, y)
// 从最后一张地毯开始检查,找到覆盖点(x, y)的最上面一张地毯
for(int i = n; i >= 1; i--) {
// 检查点(x, y)是否在地毯i的范围内
if((a[i] <= x && x <= a[i] + c[i]) && (b[i] <= y && y <= b[i] + d[i])) {
cout << i; // 输出地毯编号
return 0; // 结束程序
}
}
cout << -1; // 如果没有地毯覆盖点(x, y),输出-1
return 0;
}