#include <stdio.h>

int map[20][20];
int W,H;

int head,tail;
typedef struct{
    int x;
    int y;
} step;

step queue[900];
char line[30];

int pop(step **next){
    if(head==tail)return 0;
    *next=&(queue[head]);
    head++;
    return 1;
}

void push(int x,int y){
    queue[tail].x=x;
    queue[tail].y=y;
    tail++;
}

void clear(void){
    head=0;
    tail=0;
}

int isEmpty(void){
    if(head==tail){
        return 1;
    }
    return 0;
}

int isChecked(int x,int y){
    if(map[x][y]&16||map[x][y]&1){
        return 1;
    }else{
        return 0;
    }
}

void setChecked(int x,int y){
    map[x][y]|=16;
}

int main(void){
    while(scanf("%d %d",&W,&H),W||H){
        int x,y,count;
        step* next;
        for(y=0;y<20;y++){
            for(x=0;x<20;x++){
                map[x][y]=0;
            }
        }
        clear();
        for(y=0;y<H;y++){
            scanf("%s", line);
            for(x=0;x<W;x++){
                if(line[x]=='#'){
                    map[x][y]=1;
                }else if(line[x]=='@'){
                    push(x,y);
                }
            }
        }
        count=-1;
        while(pop(&next)){
            count++;
            x=next->x;
            y=next->y;
            if(x+1<W){
                if(!isChecked(x+1,y)){
                    push(x+1,y);
                    setChecked(x+1,y);
                }
            }
            if(x>0){
                if(!isChecked(x-1,y)){
                    push(x-1,y);
                    setChecked(x-1,y);
                }
            }
            if(y+1<H){
                if(!isChecked(x,y+1)){
                    push(x,y+1);
                    setChecked(x,y+1);
                }
            }
            if(y>0){
                if(!isChecked(x,y-1)){
                    push(x,y-1);
                    setChecked(x,y-1);
                }
            }
        }
        printf("%d\n",count);
    }
    
    return 0;
}