#include <stdio.h>

int w, h; /* 部屋の幅と高さ */
int t[400]; /* タイルの配置 */
int RED = 1, BLACK = 0;

/* 与えられた座標のタイルを始点としたときに到達できるタイルの数を返す */
int search(int x, int y) {
	int n = 0;
	if (t[w * y + x] != BLACK) return n;
	t[w * y + x] = RED;
	n++;
	if (x > 0)     n += search(x - 1, y);
	if (x < w - 1) n += search(x + 1, y);
	if (y > 0)     n += search(x, y - 1);
	if (y < h - 1) n += search(x, y + 1);
	return n;
}

int main(void) {
	int sx, sy; /* 人の初期座標 */
	int i, j;

	/* データセット毎の処理 */
	while (scanf("%d%d", &w, &h) == 2) {
		if (w < 1 || w > 20 || h < 1 || h > 20) break;
		/* タイルの配置を読み込む */
		for (i = 0; i < h; i++) {
			scanf("%*[^.#@]"); /* 改行などを無視する */
			for (j = 0; j < w; j++) {
				char c;
				scanf("%c", &c);
				switch (c) {
				case '@': /* 黒いタイルの上の人 (一つのデータセットに1度だけ出現) */
					sx = j;
					sy = i;
				case '.': /* 黒いタイル */
					t[w * i + j] = BLACK;
					break;
				case '#': /* 赤いタイル */
				default:
					t[w * i + j] = RED;
					break;
				}
			}
		}

		printf("%d\n", search(sx, sy));
	}

    return 0;
}