洛谷 P1003 铺地毯

[NOIP2011 提高组] 铺地毯

题目描述

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n 张地毯,编号从 1 到 n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。

地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

输入格式

输入共 n + 2 行。

第一行,一个整数 n,表示总共有 n 张地毯。

接下来的 n 行中,第 i+1 行表示编号 i 的地毯的信息,包含四个整数 a ,b ,g ,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标 (a, b) 以及地毯在 x 轴和 y 轴方向的长度。

第 n + 2 行包含两个整数 x 和 y,表示所求的地面的点的坐标 (x, y)。

输出格式

输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出 -1。

样例 1
样例输入 1
3
1 0 2 3
0 2 3 3
2 1 3 3
2 2

样例输出 1
3

样例 2

样例输入 2
3
1 0 2 3
0 2 3 3
2 1 3 3
4 5

样例输出 2
-1


提示

【样例解释 1】

如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点 (2,2) 的最上面一张地毯是 3 号地毯。

首先,分析每一组输入的四个数据a,b,g,k;

(a,b)——  地毯的左下角的坐标

g —— 地毯的横向长度

k —— 地毯的纵向长度

可以创建结构体node存储关于地毯的四种信息。也可以分成四个数组分开存储。

struct node
{
	int a,b;//左下角的坐标
	int g,k;//分别表示x、y轴上面的坐标 
};

因此,对于某一个坐标(x,y)的点,我们可以通过下面的两个不等式来判断点(x,y)是否被地毯覆盖

不等式:

1.判断横坐标是否符合条件 —— a<=x<=a+g

2.判断纵坐标是否符合条件 —— b<=y<=b+k

由于只需要我们输出覆盖在点(x,y)的最上面的地毯的编号,所以直接按照输入顺序的逆序进行遍历,每一次都判断点(x,y)是否被当前地毯覆盖。如果被覆盖,输出当前地毯的编号;否则继续遍历。当遍历完所有的地毯都没有输出的时候,就需要输出-1。

#include<iostream>

using namespace std;

struct node
{
	int a,b;//左下角的坐标
	int g,k;//分别表示x、y轴上面的坐标 
};

int main()
{
	int n;
	cin>>n;
	
	node total[n+1];
	for(int i=1;i<=n;i++)
		cin>>total[i].a>>total[i].b>>total[i].g>>total[i].k;
	
	int end_x,end_y;//终点坐标
	cin>>end_x>>end_y;
	
	bool flag=false; 
	for(int i=n;i>=1;i--) 
	{
		if((total[i].a<=end_x&&end_x<=total[i].a+total[i].g)&&(total[i].b<=end_y&&end_y<=total[i].b+total[i].k))
		{
			cout<<i<<endl;
			flag=true;
			break;
		}		
	}
	
	if(!flag)
		cout<<-1<<endl;
		
	return 0;
}

### P1003 Python 解题思路 P1003 是一道典型的模拟类题目,其核心在于通过程序实现对给定数据的操作流程。此题要求解决的是如何判断某个点是否被一系列矩形地毯所覆盖以及具体是由哪一张地毯覆盖的问题。 #### 数据结构设计 可以采用二维列表来存储每张地毯的信息,其中每个地毯由四个参数定义:左下角横坐标 \(a\)、纵坐标 \(b\)、宽度 \(c\) 和高度 \(d\)。这样可以通过计算得出地毯的实际范围,即 \([a, b]\) 到 \([a+c, b+d]\)[^2]。 #### 输入处理 输入部分需要读取两部分内容: 1. 地毯的数量及其对应的四元组信息; 2. 查询点的坐标 \( (x, y) \)。 对于每一行地毯的数据,将其解析并存入一个列表中以便后续访问[^4]。 #### 主要逻辑分析 遍历所有已记录的地毯信息,从最后一张向前逐一检查当前查询点是否位于某张地毯范围内。如果找到符合条件的地摊,则立即返回该地毯编号;如果没有任何地毯能够覆盖这个点,则输出 `-1` 表示未被覆盖[^4]。 以下是基于以上描述的具体Python代码实现: ```python n = int(input()) carpets = [] for _ in range(n): a, b, c, d = map(int, input().split()) carpets.append(((a, b), (a + c, b + d))) # 存储地毯的两个对角线端点 query_x, query_y = map(int, input().split()) result = -1 for idx in reversed(range(len(carpets))): ((left_bottom_x, left_bottom_y), (right_top_x, right_top_y)) = carpets[idx] if left_bottom_x <= query_x < right_top_x and \ left_bottom_y <= query_y < right_top_y: result = idx + 1 break print(result) ``` 这段代码首先接收用户输入,并构建了一个名为 `carpets` 的列表用于保存各块地毯的位置信息。接着它接受询问位置 `(query_x, query_y)` 并初始化变量 `result=-1` 假设没有任何一块地毯能盖住目标地点。最后利用循环逆序检测每一个地毯直到发现匹配项或者确认无匹配情况为止[^4]。 ### 注意事项 - **边界条件**:确保考虑到了边缘上的点是否应该算作被覆盖的情况。 - **效率考量**:由于只需要简单地逐层回溯寻找最近一层覆盖物即可满足需求,因此无需复杂算法优化时间性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值