信息学奥赛一本通 1118:铺地毯 | 1863:【11NOIP提高组】铺地毯 | OpenJudge NOI 1.9 14 | 洛谷 P1003 [NOIP2011 提高组] 铺地毯

【题目链接】

ybt 1118:铺地毯
ybt 1863:【11NOIP提高组】铺地毯
OpenJudge NOI 1.9 14:铺地毯
洛谷 P1003 [NOIP2011 提高组] 铺地毯

【题目考点】

1. 结构体
2. 数组

【解题思路】

  • 设结构体Carpet表示地毯,其中4个成员变量,(xmin, ymin)表示地毯左下点的坐标,(xmax, ymax)表示地毯右上点的坐标。设构造函数,用输入的a,b(左下角点的坐标),g,k(地毯横纵向长度)来计算出4个成员变量。设成员函数contains判断某一点是否被该地毯盖住。
  • 主函数中,设Carpet类型数组,表示多个地毯。
    • 输入数据,初始化前n个地毯。输入要盖住的点x,y
    • 从后向前遍历地毯数组,只要找到一个能盖住x,y点的地毯,就输出该地毯的编号,并结束程序。因为后输入的地毯,一定是盖在更上面的地毯。
    • 如果遍历没能找到盖住x,y点的地毯,那么该点没被盖住,输出-1。
  • : 有些同学在解题时抗拒使用结构体。这一问题不用结构体确实可以写。理论上实现任何程序都可以不用结构体。但结构体,或者说类,可以让人们能够更简单地将人的思维翻译成程序语言。写代码时使用结构体更符合人的思维习惯,写出的代码更加直观易懂。建议同学们要学会使用结构体。

【题解代码】

解法1:
#include <bits/stdc++.h>
using namespace std;
typedef struct Carpet
{
	int xmin, xmax, ymin, ymax;
	Carpet(){}
	Carpet(int a, int b, int g, int k)//用左下角坐标及横纵方向长度来初始化4个成员变量 
    {
        xmin = a;
        ymin = b;
        xmax = a + g;
        ymax = b + k;
    }
	bool contains(int x, int y)//地毯是否盖住(x,y)点
	{
		return x >= xmin && x <= xmax && y >= ymin && y <= ymax;
	}
}Carpet;

int main()
{
	int n, a, b, g, k, x, y; 
	Carpet carp[10005];
	cin>>n;
	for(int i = 1; i <= n; ++i)
	{
		cin>>a>>b>>g>>k;
		carp[i] = Carpet(a, b, g, k);
	}
	cin>>x>>y;
	for(int i = n; i >= 1; --i)//从后向前遍历,找到的第一个包含x,y点的地毯就是这一点最上面的地毯 
	{
		if(carp[i].contains(x, y))//若地毯i覆盖了点x,y 
		{
		    cout<<i;
		    return 0;
		}
	}
	cout<<-1;//若没有被地毯覆盖 
	return 0;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值