欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【NOIP2011】洛谷P1003 铺地毯 --- (C语言 + 详细注释)

程序员文章站 2024-03-17 21:00:22
...

【NOIP2011】洛谷P1003 铺地毯 --- (C语言 + 详细注释)

【NOIP2011】洛谷P1003 铺地毯 --- (C语言 + 详细注释)【NOIP2011】洛谷P1003 铺地毯 --- (C语言 + 详细注释)

//我的思路是建立一个结构体数组,结构体包含的信息有每个地毯的左下角坐标,x轴的长度,y轴的长度,以及右上角的坐标(由前面的信息求出),其实用结构体只是让每个地毯的信息更紧凑而已,更加明了,不用也行。确定了一个矩形的左下角坐标和右上角坐标就可以确定一个矩形了。通过这两个点即可确定另外某个点是否在矩形内部。由题意求最上面的一个地毯,所以一个小技巧是倒序遍历数组,找到了符和条件的矩形即停止,能节省时间

下面是我AC的代码:

#include<stdio.h>
struct point {
	int x1;       //左下角的横坐标
	int y1;       //左下角的纵坐标
	int xd;       //x轴的长度
	int yd;      //y轴的长度
	int x2;        //右上角的横坐标
	int y2;       //右上角的纵坐标
}p[10005];          //结构体数组

int main() {
	int n, i, x0, y0, ans;
	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		scanf("%d%d%d%d", &p[i].x1, &p[i].y1, &p[i].xd, &p[i].yd);
		p[i].x2 = p[i].x1 + p[i].xd;        //求出该矩形右上角的坐标
		p[i].y2 = p[i].y1 + p[i].yd;
	}
	ans = -1;           //ans初始化为-1
	scanf("%d%d", &x0, &y0);
	for(i = n - 1; i >= 0; i--)
		if (x0 >= p[i].x1 && x0 <= p[i].x2 && y0 >= p[i].y1 && y0 <= p[i].y2) {       //输入的横、纵坐标位于两点横纵坐标之间,就满足题意
			ans = i + 1;         //因为地毯编号从1开始,而数组下标从0开始,所以加1
			break;       //满足题意即跳出循环
		}
	printf("%d", ans);

	return 0;
}