http://poj.org/problem?id=1979
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=25;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n,m;
int sx,sy;
char G[maxn][maxn];
bool vis[maxn][maxn];
int ans;
void dfs(int x,int y){
ans++;
vis[x][y]=true;
for (int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if (xx>=0&&xx<n&&yy>=0&&yy<m&&G[xx][yy]=='.'&&!vis[xx][yy]){
dfs(xx,yy);
}
}
}
int main(){
while (cin >> m >> n){
if (m==0&&n==0) break;
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
cin >> G[i][j];
if (G[i][j]=='@'){
sx=i;
sy=j;
}
}
}
ans=0;
memset(vis,false,sizeof(vis));
dfs(sx,sy);
cout << ans << endl;
}
}