package challengeacm1.ch02.s01;
import java.util.Scanner;
/**
* Red and Black
* Time Limit: 1000MS Memory Limit: 30000K
* Total Submissions: 56247 Accepted: 29504
*
* http://poj.org/problem?id=1979
*
* Description
*
* There is a rectangular room, covered with square tiles. Each tile is colored either red or black.
* A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles.
* But he can't move on red tiles, he can move only on black tiles.
*
* Write a program to count the number of black tiles which he can reach by repeating the moves described above.
*
* @author Dylan
* @date 2020/5/2 - 19:49
*/
public class POJ1979 {
static final int N = 21;
static boolean mark[][];
static char arr[][] = new char[N][N];
static int w, h;
static int[] step = {0};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true){
int x=-1, y=-1;
w = sc.nextInt();
h = sc.nextInt();
sc.nextLine();
if(w == 0 && h == 0) break;
for (int i = 0; i < h; i++) {
String str = sc.nextLine();
for (int j = 0; j < w; j++) {
arr[i][j] = str.charAt(j);
if(arr[i][j] == '@'){
x = i;
y = j;
}
}
}
mark = new boolean[N][N]; // 每次恢复现场
step[0] = 0;
dfs(x,y,step);
System.out.println(step[0]);
}
}
public static void dfs(int x, int y, int[] step){
if(x < 0 || x > h - 1 || y < 0 || y > w - 1 || arr[x][y] == '#' || mark[x][y] == true){
return;
}
step[0]++;
mark[x][y] = true;
dfs(x + 1, y, step);
dfs(x - 1, y, step);
dfs(x, y + 1, step);
dfs(x, y - 1, step);
}
}