http://poj.org/problem?id=1562
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char mapp[110][110];
int viss[110][110];
int m,n;
int dir[8][2]={-1,-1,-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1};
void dfs(int x,int y)
{
viss[x][y]=1;
int dx,dy;
for(int i=0;i<8;i++)
{
dx = x + dir[i][0];
dy = y + dir[i][1];
if(dx>=0&&dx<m&&dy>=0&&dy<n&&mapp[dx][dy]=='@'&&viss[dx][dy]==0)
{
viss[dx][dy] = 1;
dfs(dx,dy);
}
}
}
int main()
{
int i;
while(scanf("%d %d",&m,&n)!=EOF&&m&&n)
{
for(i=0;i<m;i++)
scanf("%s",mapp[i]);
memset(viss, 0, sizeof(viss));
int cnt=0;
for(int p=0;p<m;p++){
for(int q=0;q<n;q++)
{
if(mapp[p][q]=='@'&&viss[p][q]==0)
{
cnt++;
dfs(p,q);
}
}
}
printf("%d\n",cnt);
}
return 0;
}