當前位置:編程學習大全網 - 編程語言 - 壹道c,c++編程題,英文的,求大神,關於建築互相遮擋

壹道c,c++編程題,英文的,求大神,關於建築互相遮擋

試驗了下,在目前數據下成功,但不保證所有情況下都適用。

是按妳的思路做的,記得把文件地址改成自己的

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

}

  • 上一篇:新能源汽車網關是什麽
  • 下一篇:防溺水征文
  • copyright 2024編程學習大全網