UVA221 Urban Elevations

题目大意:在几何数学中的笛卡尔坐标系上给出每个矩形块左下角坐标,x轴方向和y轴方向长度和z轴高度(均为实数),求正视图能被看见的矩形块,输出时x小者优先,若x相同,则y小者优先

思路分析:用结构体存储每个矩形块,利用sort,很容易按照输出顺序排列。关键在于如何判断矩形块是否可见,对于二维坐标的遍历当然是要用离散化的思想。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<set>
#include<vector>
using namespace std;

struct building
{
    int id;
    double x,y,w,d,h;
    bool operator < (const building& b) const{
        return ((x<b.x) || (x==b.x && y<b.y));
    }
}b[200];

int n,num=0;

bool isVisible(int i,int midx)
{
    if(!(b[i].x<=midx && b[i].x+b[i].w>=midx))
        return false;

    for(int j=0;j<n;j++)
    {
        if(b[j].h>=b[i].h && b[j].y<b[i].y && b[j].x <=midx && b[j].x+b[j].w>=midx)
            return false;
    }
    return true;
}

int main(void)
{
    while(cin>>n && n!=0)
    {
        if(num!=0)  puts("");
        printf("For map #%d, the visible buildings are numbered as follows:\n", ++num);
        set<double> setx; // 去重
        for(int i=0;i<n;i++)
        {
            scanf("%lf %lf %lf %lf %lf", &b[i].x, &b[i].y, &b[i].w, &b[i].d, &b[i].h);
            b[i].id = i+1;
            setx.insert(b[i].x); 
            setx.insert(b[i].x+b[i].w);
        }
        sort(b,b+n);
        vector<double> x(setx.begin(),setx.end());
        int cnt=0;

        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < x.size()-1; j ++) {
                if (isVisible(i, (x[j]+x[j+1])/2)) {
                    cnt ++;
                    printf("%s%d", cnt != 1 ? " ":"", b[i].id);
                    break;
                }
            }
        }
        puts("");
    }
    return 0;
}

 

posted @ 2020-06-03 21:43  ジャスミン  阅读(97)  评论(0编辑  收藏  举报