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