只dfs上下左右即可
#include<stdio.h>
#include<stdlib.h>
char maze[25][25];
int ans, n, m;
void dfs(int i, int j) {
maze[i][j] = '#';
for (int s = -1; s <= 1; s++) {
for (int t = -1; t <= 1; t++) {
if (abs(s) != abs(t)) {
int x = i+s, y = t+j;
if (x >= 0 && y>=0 && x < m && y < n && maze[x][y] == '.') {
ans++;
dfs(x, y);
}
}
}
}
}
int main(void)
{
while (scanf("%d %d", &n, &m) != EOF && (n&&m)) {
getchar();
ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
maze[i][j] = getchar();
}
getchar();
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (maze[i][j] == '@') {
dfs(i, j);
}
}
}
printf("%d\n", ans+1);
}
return 0;
}