思路分析
1. 输入处理:程序首先读取地毯的数量n。然后依次读取每张地毯的信息,包括左下角坐标(a, b)和尺寸(c, d),并存储在数组中。- 查询点的输入:读取要查询的点的坐标(x, y)。
- 从最后一张地毯开始,依次向前检查每张地毯是否覆盖点(x, y)。
- 检查条件是:x在地毯的x范围内(a[i] <= x <= a[i] + c[i])且y在地毯的y范围内(b[i] <= y <= b[i] + d[i])。
- 如果找到覆盖点(x, y)的地毯,输出该地毯的编号i。
- 如果没有任何地毯覆盖点(x, y),输出-1。
关键点
- 从后向前检查:因为后铺的地毯会覆盖前面的地毯,所以从最后一张地毯开始检查,确保找到的是最上面的地毯。
- 边界条件:在地毯的边界和顶点上的点也算被覆盖,因此检查条件包括等号
#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; }
标签:5253,读取,覆盖,检查,int,d%,枚举,地毯 From: https://www.cnblogs.com/jyssh/p/18472627