当前位置: 代码迷 >> 综合 >> Uva221 Urban Elevations
  详细解决方案

Uva221 Urban Elevations

热度:67   发布时间:2023-12-05 13:32:00.0

第一次接触离散化这个概念,发现真的非常奇妙,简单的分析和去重就将无限映射为有限。

原题:

分析:将建筑的左右端点存入x数组中,则相邻x坐标构成的区间内的点具有相同属性。不妨取其中点来探究建筑是否可见。 

以下代码在紫书上刘汝佳老师的参考代码基础上进行了部分修改。

代码:

#include<iostream>
#include<algorithm>
#include<array>
#define endl "\n"
using namespace std;
const int maxn=110;
struct Building
{int id;double x,y,w,d,h;bool operator < (const Building& rhs) const{return x<rhs.x||(x==rhs.x&&y<rhs.y);}
};
int n;
array<Building,maxn> b;
array<double,2*maxn> x;
bool cover(int i,double mx)
{return b[i].x<=mx&&mx<=b[i].x+b[i].w;
}//判断点是否在建筑物x坐标范围内
bool visible(int i,double mx)
{if(!cover(i,mx)){return false;}for(int k=0;k<n;k++){if(cover(k,mx)&&b[k].y<b[i].y&&b[k].h>=b[i].h){return false;}}return true;
}//判断建筑物是否可见
int main(void)
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int kase=0;while(cin>>n&&n){b.fill(Building());x.fill(0);for(int i=0;i<n;i++){cin>>b[i].x>>b[i].y>>b[i].w>>b[i].d>>b[i].h;x[2*i]=b[i].x;x[2*i+1]=b[i].x+b[i].w;b[i].id=i+1;}sort(b.begin(),b.begin()+n);sort(x.begin(),x.begin()+2*n);int m=unique(x.begin(),x.begin()+2*n)-x.begin();if(kase++){cout<<endl;}cout<<"For map #"<<kase<<", the visible buildings are numbered as follows:"<<endl<<b[0].id;for(int i=1;i<n;i++){bool vis=false;for(int j=0;j<m-1;j++){if(visible(i,(x[j]+x[j+1])/2)){vis=true;break;}}if(vis){cout<<" "<<b[i].id;}}cout<<endl;}return 0;
}