洛谷 P1003 铺地毯

题目描述

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

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

思路: 用栈模拟先后放入次序, 用边界条件判断是否在地毯内,不在地毯内就出栈,如果栈空还没找到则说明此点不在地毯上;

#include <iostream>
#include <stack>
using namespace std;

struct node {
	int a, b, x, y;
	node(int aa, int bb, int xx, int yy) {
		a = aa;
		b = bb;
		x = xx;
		y = yy;
	}
};

stack<node> stk;

int main() {
	int N;
	cin>>N;
	for (int i = 0; i < N; i++) {
		int a, b, c, d;
		cin>>a>>b>>c>>d;
		stk.push(node(a, b, c, d));
	}
	int x, y;
	cin>>x>>y;
	node now = stk.top();
//	stk.pop();
	int f = 0;
	int cnt = 0;
	while(!((now.a <= x) && (x <= (now.a+now.x)) && (now.b <= y) && (y <= (now.b+now.y)))) {
//		cout<<now.a<<now.b<<now.x<<now.y<<endl;
//		if (!stk.empty()) {  这里直接判空的话出现了异常, 还没发现原因,改为计数的方法判断是否栈空
//			f = 1;
//			break;
//		}
		cnt++;
		if (cnt == N) {
			f = 1;
			break;
		}
		stk.pop();

		now = stk.top();


	}
	if (f == 0) {
		cout<<stk.size();
	} else {
		cout<<-1;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值