#include<cstdio>
#include<cstring>
using namespace std;
#define N 22
int s,h,w,vis[N][N];
char b[N][N],c[N];
void dfs(int x,int y){
if(x<1||x>h||y<1||y>w||b[x][y]==‘#‘) return ;
if(vis[x][y]) return ;
if(b[x][y]==‘.‘){
s++;vis[x][y]=1;
}
dfs(x+1,y);
dfs(x,y+1);
dfs(x-1,y);
dfs(x,y-1);
}
int main(){
for(;scanf("%d%d",&w,&h)!=EOF&&w&&h;){
s=1;
memset(vis,0,sizeof vis);
int x,y;
for(int i=1;i<=h;i++){
scanf("%s",c);
for(int j=1;j<=w;j++){
b[i][j]=c[j-1];
if(b[i][j]==‘@‘) x=i,y=j;
}
}
dfs(x,y);
printf("%d\n",s);
}
return 0;
}
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define N 301
int w,h,dx[]={1,0,0,-1},dy[]={0,1,-1,0};
struct node{
int x,y;
}o,t;
queue<node>q;
char str[N];
int a[N][N],vis[N][N];
inline void bfs(){
int cnt=0;
q.push(o);
while(!q.empty()){
o=q.front();
for(int j=0;j<4;j++){
t.x=dx[j]+o.x;
t.y=dy[j]+o.y;
if(t.x<0||t.y<0||t.x>=h||t.y>=w);else
if(!vis[t.x][t.y]&&!a[t.x][t.y]){
vis[t.x][t.y]=1;
q.push(t);
cnt++;
}
}
q.pop();
}
if(cnt==0) cnt++;
printf("%d\n",cnt);
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
vis[i][j]=0,a[i][j]=0;
}
int main(){
while(scanf("%d%d",&w,&h)==2&&w&&h){
for(int i=0;i<h;i++){
scanf("%s",str);
for(int j=0;j<w;i++){
if(str[j]==‘#‘)
a[i][j]=1;
else if(str[j]==‘@‘)
o.x=i,o.y=j;
}
}
bfs();
}
return 0;
}