zoukankan      html  css  js  c++  java
  • 大楼轮廓

      Given N buildings in a x-axis,each building is a rectangle and can be represented by a triple (start, end, height),where start is the start position on x-axis, end is the end position on x-axis and height is the height of the building. Buildings may overlap if you see them from far away,find the outline of them。

    An outline can be represented by a triple, (start, end, height), where start is the start position on x-axis of the outline, end is the end position on x-axis and height is the height of the outline.

     注意事项

      请注意合并同样高度的相邻轮廓,不同的轮廓线在x轴上不能有重叠。

    #include <iostream>
    #include <map>
    #include <algorithm>
    #include <list>
    using namespace std;
    
    typedef struct Node
    {
        bool isUp;
        int height;
        int pos;
        Node ()
        {
            this->isUp=true;
            this->height=0;
            this->pos=0;
        }
        Node(bool _isUp,int h,int p)
        {
            this->isUp=_isUp;
            this->height=h;
            this->pos=p;
        }
        bool operator()(const Node &a,const Node &b)
        {
            return a.pos<=b.pos;
        }
            
    }Node;
    
    list<list<int> > building_outline(const vector<vector<int> > &a)
    {
        list<list<int> > res;
        if(a.empty()||a.at(0).size()<=2)
            return res;
        
        map<int,int> bulidMap;
        map<int,int> resMap;
        vector<Node> node(a.size()*2);
        
        for(int i=0;i<a.size();++i)
        {
            node[i*2]=Node(true,a.at(i).at(2),a.at(i).at(0));
            node[i*2+1]=Node(false,a.at(i).at(2),a.at(i).at(1));
        }
        sort(node.begin(),node.end(),Node());
    
        for(auto it=node.begin();it!=node.end();++it)
        {
            //如果此点是楼上升的位置 
            if((*it).isUp)
            {
                if(bulidMap.count((*it).height)==0)
                    bulidMap.insert({(*it).height,1});
                else
                    ++bulidMap[(*it).height];
            }
            else//此点是楼下降的位置 
            {
                if(bulidMap.count((*it).height)==1)
                    bulidMap.erase((*it).height);
                else
                    --bulidMap[(*it).height];
            }
            
            if(bulidMap.empty())
                resMap.insert({(*it).pos,0});
            else
                resMap.insert({(*it).pos,(--bulidMap.end())->first});
        }
            
        int start=0,height=0;
        for(const auto &i:resMap)
        {
            int curStart=i.first;
            int curHeight=i.second;
            if(height!=curHeight)
            {
                if(height!=0)
                {
                    list<int> l;
                    l.push_back(start);
                    l.push_back(curStart);
                    l.push_back(height);
                    res.push_back(l);
                }
                start=curStart;
                height=curHeight;
            }
        }
        return res;
    }
    
    int main()
    {
        vector<vector<int> > a{{1,3,3},{2,4,4},{5,6,1}};
        list<list<int> > res=building_outline(a);
        
        for(const auto &it:res)
        {
            for(auto i=it.begin();i!=it.end();++i)
                cout<<*i<<" ";
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Js 时间轴和拓扑图
    JQuery OLAP Grid
    Jquery Datatables 动态列名
    CSS3实用菜单
    图片翻转动画
    Java转C#的最佳工具
    Mvc.JQuery.Datatables
    推荐windows下的日志跟踪工具:SnakeTail
    在.net中使用aquiles访问Cassandra(四)
    在.net中使用aquiles访问Cassandra(三)
  • 原文地址:https://www.cnblogs.com/tianzeng/p/10555205.html
Copyright © 2011-2022 走看看