哈哈哈,劳资终于过了这题了
没算法,就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;
}