uva--221--Urban Elevations

哈哈哈,勞資終於過了這題了

沒算法,就100個房子,暴力判斷能不能被擋住。

注意一個房子可能被幾個房子一起擋住的就情況就可以了,就這這種情況搞了我好幾個小時。。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 120
using namespace std;
struct Build
{
    int x,y;
    int wd,dep,height;
}p[maxn];
int ans[maxn],ic;
int n;
bool init()
{
    scanf("%d",&n);
    ic=0;
    return n;
}
int cmpBuild(Build a,Build b)
{
    return a.x<b.x;
}
bool visible(int d)
{
    Build u,fr[maxn];
    Build a=p[d];
    int right_most=-1;
    bool pab;
    int fc=0;
    for(int i=1;i<=n;i++)
    {
        u=p[i];
        //if(i==d)continue;
        if(u.y>=a.y)continue;
        int mid=u.x;
        pab=mid>=a.x&&mid<=(a.x+a.wd);
        mid=u.x+u.wd;
        pab=pab||(mid>=a.x&&mid<=(a.x+a.wd));
        pab=pab||(u.x<=a.x&&(u.x+u.wd>=a.x+a.wd));
        if(pab&&a.height<=u.height)
        {
            fr[fc++]=u;
            right_most=max(right_most,u.x+u.wd);
        }
    }
    if(fc==0)return true;
    sort(fr,fr+fc,cmpBuild);
    if(fr[0].x>a.x||right_most<(a.x+a.wd))return true;
    right_most=fr[0].x+fr[0].wd;
    for(int i=1;i<fc;i++)
    {
        if(fr[i].x>right_most)return true;
        right_most=max(right_most,fr[i].x+fr[i].wd);
    }
    return false;
}
int cmp(int i,int j)
{
    Build a=p[i];
    Build b=p[j];
    if(a.x==b.x)
    {
        return a.y<b.y;
    }
    else
    {
        return a.x<b.x;
    }
}
int solve()
{
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d%d",&p[i].x,&p[i].y,&p[i].wd,&p[i].dep,&p[i].height);
    }
    for(int i=1;i<=n;i++)
    {
        if(visible(i))
        {
            ans[ic++]=i;
        }
    }
    sort(ans,ans+ic,cmp);
    return ic;
}

int main()
{
    //freopen("221.txt","r",stdin);
    int ks=1;
    while(init())
    {
        if(ks!=1)printf("\n");
        printf("For map #%d, the visible building%s are numbered as follows:\n",ks++,solve()==1?"s":"s");
        for(int i=0;i<ic;i++)
        {
            printf("%d",ans[i]);
            if(i!=ic-1)printf(" ");
            else printf("\n");
        }
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章