b701
輸入說明 :
前面兩個數字 16 <=X<=512 16 <=Y<=512
分別代表地圖資料的X軸及Y 軸長度
下方的地圖用0代表海洋,1代表陸地。
輸出說明 :
每一塊土地輸出五個數字
W N E S A
分別代表極西、極北、極東、極南、面積
依照土地所在的位置,由上而下、由左而右順序顯示
這題第一個你開一個上下左右都比題目大1單位的二維陣列,這樣的好處是你的陣列的邊邊角角不用特別處理
再來用遞迴把第1塊陸地全部改成2,第2塊陸地全部改成3,這樣找最南最北最東最西才不會找到其他陸地的
#include<stdio.h>
void find(int yfind,int xfind, int t[][514],int q)
{
t[yfind][xfind]=q;
if( t[yfind+1][xfind]!=1&&t[yfind-1][xfind]!=1&&
t[yfind][xfind+1]!=1&&t[yfind][xfind-1]!=1 )
return ;
if(t[yfind+1][xfind]==1)
find(yfind+1,xfind,t,q);
if(t[yfind-1][xfind]==1)
find(yfind-1,xfind,t,q);
if(t[yfind][xfind+1]==1)
find(yfind,xfind+1,t,q);
if(t[yfind][xfind-1]==1)
find(yfind,xfind-1,t,q);
}
int main()
{
int x,y;
scanf("%d%d",&x,&y);
int a[514][514];
int i,j,k;
for(i=0;i<514;i++)
for(j=0;j<514;j++)
a[i][j]=0;
for(i=1;i<=y;i++)
for(j=1;j<=x;j++)
scanf("%d",&a[i][j]);
/*
for(i=0;i<y+2;i++)
{
for(j=0;j<x+2;j++)
printf("%d",a[i][j]);
puts("");
}
*/
int land=2;
for(i=1;i<=y;i++)
for(j=1;j<=x;j++)
{
if(a[i][j]==1)
{
find(i,j,a,land);
land++;
}
}
int loca[5][land-2];
//歸零
for(i=0;i<5;i++)
for(j=0; j<(land-2) ;j++)
loca[i][j]=0;
//找面積
for(k=2;k<=(land-1);k++)
for(i=1;i<=y;i++)
for(j=1;j<=x;j++)
{
if(a[i][j]==k)
loca[4][k-2]++;
}
//最西 ,第一格
for(k=2;k<=(land-1);k++)
{
for(j=1;j<=x;j++)
{
for(i=1;i<=y;i++)
{
if(a[i][j]==k)
{
loca[0][k-2]=j-1;
break;
}
}
if(loca[0][k-2]!=0)
break;
}
}
//最東 ,第三格
for(k=2;k<=(land-1);k++)
{
for(j=x;j>=1;j--)
{
for(i=1;i<=y;i++)
{
if(a[i][j]==k)
{
loca[2][k-2]=j-1;
break;
}
}
if(loca[2][k-2]!=0)
break;
}
}
//最北 ,第二格
for(k=2;k<=(land-1);k++)
{
for(i=1;i<=y;i++)
{
for(j=1;j<=x;j++)
{
if(a[i][j]==k)
{
loca[1][k-2]=i-1;
break;
}
}
if(loca[1][k-2]!=0)
break;
}
}
// 最南,第四格
for(k=2;k<=(land-1);k++)
{
for(i=y;i>=1;i--)
{
for(j=1;j<=x;j++)
{
if(a[i][j]==k)
{
loca[3][k-2]=i-1;
break;
}
}
if(loca[3][k-2]!=0)
break;
}
}
//答案
for(i=0;i<land-2;i++)
{
printf("%d %d %d %d %d\n",loca[0][i],loca[1][i],loca[2][i],loca[3][i],loca[4][i]);
}
}