目录
一,问题
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n张地毯,编号从1到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
输入输出样例1说明:如下图,1号地毯用实线表示,2号地毯用虚线表示,3号用双实线表示,覆盖点(2,2)的最上面一张地毯是3号地毯。
输入输出样例2说明:如下图,1号地毯用实线表示,2号地毯用虚线表示,3号用双实线表示,覆盖点(4,5)的最上面没有一张地毯。
输入描述
第一行,一个整数n,表示总共有n张地毯。
接下来的n行中,第i+1行表示编号i的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y轴方向的长度。
第n+2行包含两个正整数x和y,表示所求的地面的点的坐标(x,y)。
输出描述
输出共1行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出−1。
用例输入 1
3 1 0 2 3 0 2 3 3 2 1 3 3 2 2
用例输出 1
3
用例输入 2
3 1 0 2 3 0 2 3 3 2 1 3 3 4 5
用例输出 2
-1
二,思路+代码
这道题可以采用两种方法来解决:
- 一种方法:使用二维数组
- 另外一种方法:如果还没学到二维数组,只学了一维数组,那么就可以使用结构体来解决这道题。
1,结构体
现在我先用结构体来解决这道题。
1)思路
- 创建结构体J,用来存放一张地毯的相关信息:x坐标x,y坐标y,地毯的宽w,地毯的高h。之后根据地毯的总数n,键盘输入n张地毯的信息。
- 因为先铺上去的地毯会被后铺上去的地毯盖住,所以我想要知道组织者站着的是第几张地毯,就需要从结构体的最后一张地毯开始判断:如果组织者站的坐标位置xz,yz包含在结构体中的某一张地毯的范围内(j[i].x=<xz<=j[i].x+j[i].w &与 j[i].y<=yz<=j[i].y+j[i].h),那么就表示,组织者踩着的地方有地毯,可以输出对应的地毯序数:i+1(在结构体和数组中,序数=下标+1),否则没有地毯,就输出-1。
2)代码
#include <bits/stdc++.h>
using namespace std;
struct J
{
int x,y,w,h;
};
int main()
{
int n,xz,yz;
cin >>n;
J j[n];
for (int i=0; i<n; i++) cin >>j[i].x>>j[i].y>>j[i].w>>j[i].h;
cin>>xz>>yz;
for (int i=n-1; i>=0; i--)
{
if (xz>=j[i].x&&xz<=j[i].x+j[i].w&&yz>=j[i].y&&yz<=j[i].y+j[i].h)
{
cout<<(i+1);
return 0;
}
}
cout<<-1;
return 0;
}
2,二维数组
1)思路
- 使用二维数组的步骤和结构体差不多,在这里我不需要声明一个结构体,只需要声明定义一个n行4列的二维数组a[n][4]
- 二维数组的行数取决于地毯的总共张数,可以搞一个for循环,来实现从第一张地毯到最后一张地毯的信息赋值(键盘输入),行的序数可以和for循环中的循环变量保持一致,列的序数可以选择再嵌套一个for循环来控制(代码上显示的方法),也可以直接写上指定的值,这道题中的每一行的列数都是4列,可以直接用a[i][0]表示第i+1行的第0+1列,a[i][1]表示第i+1行的第1+1列,a[i][2]表示第i+1行的第2+1列,a[i][3]表示第i+1行的第3+1列。(例如:for(int i=0; i<n; i++) cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3];)
- 因为先铺上去的地毯会被后铺上去的地毯盖住,所以我想要知道组织者站着的是第几张地毯,就需要从二维数组的最后一张地毯开始判断:如果组织者站的坐标位置xz,yz包含在二维数组中的某一张地毯的范围内(a[i][0]=<xz<=a[i][0]+a[i][2] 与 a[i][1]<=yz<=a[i][1]+a[i][3]),那么就表示,组织者踩着的地方有地毯,可以输出对应的地毯序数:i+1(在结构体和数组中,序数=下标+1),否则没有地毯,就输出-1。
2)代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,xz,yz;
cin>>n;
int a[n][4];
for(int i=0;i<n;i++){
for(int j=0;j<4;j++){
cin>>a[i][j];
}
}
cin>>xz>>yz;
for(int i=n-1;i>=0;i--){
if(xz>=a[i][0] & xz<=a[i][0]+a[i][2] & yz>=a[i][1] &yz<=a[i][1]+a[i][3]){
cout<<(i+1);
return 0;
}
}
cout<<-1;
return 0;
}
有问题请在评论区留言或者是私信我,回复时间不超过一天。