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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值