是按妳的思路做的,記得把文件地址改成自己的
fp=fopen("E:\\data.txt","r");
思路:自己跳過,在左邊的過,在右邊的過,在後面的過,低的過。其它的記下,有可能擋住。
如果只有壹個,看它是否完全擋住,沒有則可見。有兩個以上的,如果中間有空則可見,如果沒有按壹個大的整體處理,看第壹個的x,和最後壹個的x+width,是否包含目前的建築即可。
#include "stdio.h"
#include "ctype.h"
#include "string.h"
#define Max 100
struct node{
int x;
int y;
int width;
int depth;
int height;
}b[100];
void main()
{
FILE *fp;
int f,n;
int i,j,k,m,t;
int befNum,vNum;
int before[Max];
int v[Max];
f=1;
fp=fopen("E:\\data.txt","r");
if(fp==NULL)
{
printf("read file error!\n");
return;
}
while(f)
{
fscanf(fp,"%d",&n);
if(n==0)
{
break;
f=0;
}
for(i=0;i<n;i++)
{
fscanf(fp,"%d%d%d%d%d",&b[i].x,&b[i].y,&b[i].width,&b[i].depth,&b[i].height);
}
vNum=0;
for(i=0;i<n;i++)
{
befNum=0;
for(j=0;j<n;j++)
{
if(j==i)continue;
if(b[j].height<b[i].height)continue;
if((b[j].x+b[j].width)<b[i].x)continue;
if(b[j].x>(b[i].x+b[i].width))continue;
if(b[j].y>b[i].y)continue;
before[befNum]=j;
befNum++;
}
if(befNum==0)
{
v[vNum]=i;
vNum++;
}else
{
for(k=0;k<befNum;k++)
for(m=k+1;m<befNum;m++)
{
if(b[before[k]].x>b[before[m]].x)
{
t=before[k];
before[k]=before[m];
before[m]=t;
}
}
if(befNum==1)
{
if(b[before[0]].x<=b[i].x && b[before[0]].x+b[before[0]].width>=b[i].x+b[i].width)
{}else
{
v[vNum++]=i;
}
}else
{
for(k=0;k<befNum-1;k++)
{
if((b[before[k]].x+b[before[k]].width)<b[before[k+1]].x)
{
v[vNum]=i;
vNum++;
break;
}
}
if(k==befNum-1)
{
if(b[before[0]].x<=b[i].x && b[before[befNum-1]].x+b[before[befNum-1]].width>=b[i].x+b[i].width)
{}else
{
v[vNum++]=i;
}
}
}
}
}
for(k=0;k<vNum;k++)
for(m=k+1;m<vNum;m++)
{
if(b[v[k]].x>b[v[m]].x)
{
t=v[k];
v[k]=v[m];
v[m]=t;
}
}
for(i=0;i<vNum;i++)printf("%d ",v[i]+1);
printf("\n");
}
fclose(fp);
}