ZOJ 2412 Farm Irrigation

又見深搜題,這裏是借鑑了 zoj 1008 對 卡片 結構體數組 的操縱,和 zoj 1709 的 flood_fill 的經驗。

#include <stdio.h>
#include <string.h>
#define MAXM (50+5)
#define MAXN (50+5)

typedef struct
{
    int up;
    int right;
    int down;
    int left;
}Pipe;

int M,N;
char input[MAXM][MAXN];
Pipe map[MAXM][MAXN];
int visit[MAXM][MAXN];
Pipe kind[11]=
{
            {1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},
            {1,0,1,0},{0,1,0,1},{1,1,0,1},{1,0,1,1},
            {0,1,1,1},{1,1,1,0},{1,1,1,1}
};

void init()
{
    int i,j;
    for( i=0; i<M;i++)
        for( j=0; j<N;j++)
            map[i][j]= kind [input[i][j]-'A'];
    memset(visit,0,sizeof(visit));
}

int in_map(int cloumn,int row)
{
    if( cloumn <0 || cloumn>= M )
        return 0;
    if( row <0 || row >= N )
        return 0;
    return 1;
}

void dfs(int cloumn,int row)
{
    if( visit[cloumn][row] ) return ;
    visit[cloumn][row]=1;

    if( map[cloumn][row].up && in_map( cloumn-1,row )
       && map[cloumn-1][row].down )
        dfs( cloumn-1 ,row );

    if( map[cloumn][row].right && in_map( cloumn,row+1 )
       && map[cloumn][row+1].left )
        dfs( cloumn, row+1 );

    if( map[cloumn][row].down && in_map( cloumn+1,row )
       && map[cloumn+1][row].up )
        dfs( cloumn+1, row );

    if( map[cloumn][row].left && in_map( cloumn,row-1 )
       && map[cloumn][row-1].right )
        dfs( cloumn, row-1 );
}

int main()
{
    int i,j,sum;
    while( scanf("%d%d",&M,&N) && !( M == -1 && N == -1 ) )
    {
        for( i=0; i<M; i++ )
            scanf("%s",input[i]);
        init();
        sum=0;
        for( i=0; i<M ;i++ )
            for( j=0;j<N ; j++ )
                if(  ! visit[i][j] )
                {
                    dfs(i,j);
                    sum++;
                }
        printf("%d\n",sum);
    }
    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章