建筑物的轮廓问题

本文探讨了如何解决建筑物轮廓合并的问题,通过描述一个基于线段的算法,该算法使用了分治法思想,类似于归并排序。文章提到了算法的关键步骤,并指出存在一些需要进一步细化考虑的地方。

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

问题描述:描述
对于城市中几座建筑外形,给出这些建筑的二维轮廓。
•关于输入
输入的第一行是正整数 n(1<= n <=100 000),表示建筑的数目。
接下来 n 行,每行三个正整数start end height,表示建筑的左边界、右边界和高度。
•关于输出
输出建筑群的轮廓,包含多行,从左到右输出建筑的边界:(U|D|R) len

U、D、R分别表示上、下、右,即建筑边界延伸的方向,len为正整数,表示边界在此方向上延伸的长度。

算法:

建筑物轮廓合并伪代码
r = new Line; x = 0; y = 0; pre = -1;
while (p.s < INF || q.s < INF) { // 判断是否合并完成
r.s = (p.s <= q.s) ? p.s : q.s; // 找最先的转折点
if (r.s == p.s) { // 第一条轮廓线的高度变化
x = p.h; p = p.next;
}
if (r.s == q.s) { // 第二条轮廓线的高度变化
y = q.h; q = q.next;
}
r.h = (x >= y) ? x : y; // 取较高的轮廓
if (r.h != pre) { // 只有高度与之前不同才是一个新转折点
pre = r.h;
r.next = new Line;
r = r.next;
}
}
r.s = INF;
建筑轮廓问题

以上参考了汪小林 分治法的建筑物轮廓问题,归并排序类似用了分治法。上面算法有些地方没有考虑到那样的细致

如下我的代码:

// 轮廓问题1.cpp : 定义控制台应用程序的入口点。
//

// 轮廓.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值