UVa Problem 105 - Skyline Problem

本文探讨了一种高效解决 UVa Problem 105 中高楼与矩形碰撞问题的方法。通过利用一维数组模拟高楼的高度变化,简化了交点判断过程,优化了解题流程。此方法巧妙地利用数组填充法,实现了对高楼高度的动态更新和矩形并集的快速构建,最终输出碰撞点坐标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// UVa Problem 105 - Skyline Problem
// Verdict: Accepted
// Submission Date: 2011-11-22
// UVa Run Time: 0.036s
//
// 版权所有(C)2011,邱秋。metaphysis # yeah dot net
//
// [解题方法]
// 最初是想把交点都求出来,然后判断交点是否在矩形内,但是写出来的代码丑陋难看,心想,难道没有更好
// 的方法吗?仔细观察了一下题目给的图,灵机一动,难道不能用数组来模拟高楼吗?反正坐标最大也就是
// 10000,使用一维数组来表示横坐标,数组的值来表示纵坐标,那么矩形的 “并” 就相当容易表示了,只要
// 判断在某横坐标位置最大的纵坐标即可,可以使用类似于填充法的思想来建立 “高楼” 数组,对于一个给定
// 的矩形 (L,H,R),将数组下标为 [L, R] 范围内的值全部置为 H,当然前提条件是数组的先前值小于
// H,这就相当于实现了更高的楼将较矮的楼覆盖的效果,从而方便的表示了矩形的 “并集”,那么再按要求输
// 出坐标值就不难了。

#include <iostream>
#include <cstring>

using namespace std;

#define MAXN 10010

int grid[MAXN];

int main (int argc, char const* argv[])
{
	int left, height, right, leftMost, rightMost = 0;
	bool leftSetted = false;

	memset(grid, 0, sizeof(grid));

	while (cin >> left >> height >> right)
	{
		for (int i = left; i <= right; i++)
			grid[i] = max(grid[i], height);

		if (!leftSetted)
		{
			leftMost = left;
			leftSetted = true;
		}
		
		rightMost = max(rightMost, right);
	}

	cout << leftMost << " " << grid[leftMost];

	int current = leftMost;
	for (int i = leftMost; i <= rightMost; i++)
	{
		if (grid[i] == grid[current])
			continue;
		else
		{
			if (grid[i] > grid[current])
				cout << " " << i << " " << grid[i];
			else
				cout << " " << (i - 1) << " " << grid[i];
				
			current = i;
		}
	}

	cout << " " << rightMost << " 0\n";

	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值