5253 铺地毯 枚举 模拟

思路分析

 
1. 输入处理:程序首先读取地毯的数量n。然后依次读取每张地毯的信息,包括左下角坐标(a, b)和尺寸(c, d),并存储在数组中。
 
  • 查询点的输入:读取要查询的点的坐标(x, y)。
 
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。
 
  • 如果没有任何地毯覆盖点(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;
}

 

posted @ 2024-10-17 16:47  CRt0729  阅读(5)  评论(0编辑  收藏  举报