从最左边遍历到最右边,算出每个点的最高点,把横坐标轴放大了一倍,避免连续点的上下起伏
#include <iostream>
#include <vector>
using namespace std;
struct Building
{
Building(const int& iLeft, const int& iHeight, const int& iRight)
{
this->iLeft = iLeft;
this->iHeight = iHeight;
this->iRight = iRight;
}
int iLeft = 0;
int iHeight = 0;
int iRight = 0;
};
class TheSkylineProblem
{
public:
void readBuildings();
void computeSkyline();
void outputResult();
private:
vector<Building> m_vecBuildings;
vector<int> m_vecSkyline;
};
void TheSkylineProblem::readBuildings()
{
int iLeft = 0;
int iHeight = 0;
int iRight = 0;
while (cin >> iLeft >> iHeight >> iRight)
{
m_vecBuildings.push_back(Building(iLeft, iHeight, iRight));// UVa不支持初始化列表
}
}
void TheSkylineProblem::computeSkyline()
{
int iRight = 0;
for (auto& it : m_vecBuildings)
{
if (it.iRight >= iRight)
{
iRight = it.iRight;
}
}
m_vecSkyline.resize(iRight);
int iLeft = m_vecBuildings.begin()->iLeft;
if (iLeft & 1 == 0)
{
++iLeft;
}
for (int i = iLeft; i < iRight * 2; i += 2)
{
for (auto& it : m_vecBuildings)
{
if (it.iLeft * 2 <= i && i <= it.iRight * 2 && it.iHeight >= m_vecSkyline[i / 2])
{
m_vecSkyline[i / 2] = it.iHeight;
}
}
}
}
void TheSkylineProblem::outputResult()
{
int iHeight = 0;
for (int i = m_vecBuildings.begin()->iLeft; i < m_vecSkyline.size(); ++i)
{
if (iHeight != m_vecSkyline[i])
{
cout << i << " " << m_vecSkyline[i] << " ";
iHeight = m_vecSkyline[i];
}
}
cout << m_vecSkyline.size() << " 0" << endl;
}
int main()
{
TheSkylineProblem objTheSkylineProblem;
objTheSkylineProblem.readBuildings();
objTheSkylineProblem.computeSkyline();
objTheSkylineProblem.outputResult();
return 0;
}