http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=709
#include<stdio.h>
#include<math.h>
const int maxn = 1005 ;
char mapp[ maxn ][ maxn ] ;
int dir[ 8 ][ 2 ] ={ {-1 , -1} , { -1 , 0 } , { -1 , 1 } , { 0 , 1 } , { 1 , 1 } , { 1 , 0 } ,{ 1, -1},{ 0 , -1} } ;
int n , m ;
int dfs( int si , int sj )
{
mapp[ si ][ sj ] = '*' ;
for( int i = 0 ; i < 8 ; i++ )
{
int xi = si + dir[ i ][ 0 ] ;
int yi = sj + dir[ i ][ 1 ] ;
if( xi < 0 || yi < 0 || xi >= n || yi >= m )
continue ;
if( mapp[ xi ][ yi ] == '@')
dfs( xi , yi ) ;
}
}
int main()
{
int sum ;
int i , j ;
while(1)
{
scanf( "%d%d" , &n , &m ) ;
if(n == 0 )
break;
for( i= 0 ; i < n ; i++ )
{
scanf( "%s" , mapp[ i ] ) ;
}
sum = 0 ;
for( i = 0 ; i < n ; i++ )
for( j = 0 ; j < m ;j++ )
{
if( mapp[ i ][ j ] == '@' )
{
dfs( i , j );
sum ++ ;
}
}
printf( "%d\n" , sum );
}
return 0 ;
}