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

}