又見深搜題,這裏是借鑑了 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;
}