c++习题14-铺地毯

目录

一,问题

 二,思路+代码

1,结构体

1)思路

2)代码 

2,二维数组

1)思路

2)代码 


 

一,问题

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有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)思路

  1.  创建结构体J,用来存放一张地毯的相关信息:x坐标x,y坐标y,地毯的宽w,地毯的高h。之后根据地毯的总数n,键盘输入n张地毯的信息。
  2. 因为先铺上去的地毯会被后铺上去的地毯盖住,所以我想要知道组织者站着的是第几张地毯,就需要从结构体的最后一张地毯开始判断:如果组织者站的坐标位置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)思路

  1. 使用二维数组的步骤和结构体差不多,在这里我不需要声明一个结构体,只需要声明定义一个n行4列的二维数组a[n][4]
  2. 二维数组的行数取决于地毯的总共张数,可以搞一个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];)
  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;
}

有问题请在评论区留言或者是私信我,回复时间不超过一天。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值