【题目链接】
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;
}