http://acm.hdu.edu.cn/showproblem.php?pid=1241
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int dir[8][2]={{1,0},{-1,0},{0,-1},{0,1},{-1,-1},{1,1},{-1,1},{1,-1}};
int m,n;
int flag[105][105];
char map[105][105];
void bfs(int x,int y){
for(int i=0;i<8;i++){
int X=x+dir[i][0];
int Y=y+dir[i][1];
if(X>=0 && X<m && Y>=0 && Y<n && map[X][Y]=='@' && flag[X][Y]==0){
flag[X][Y]=1;
bfs(X,Y);
}
}
return ;
}
int main()
{
while(scanf("%d %d",&m,&n)!=EOF&&m!=0&&n!=0){
getchar();
memset(flag,0,sizeof(flag));
for(int i=0;i<m;i++){
for(int j=0;j<=n;j++){
scanf("%c",&map[i][j]);
}
}
int count=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if( map[i][j]=='@' && flag[i][j]==0){
flag[i][j]=1;
bfs(i,j);
count++;
}
}
}
printf("%d\n",count);
}
return 0;
}