Problem:
Problem B: Red and Black

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.

Input

The input consists of multiple data sets.
A data set starts with a line containing two positive integers W and H;
W and H are the numbers of tiles in the x-
and y- directions, respectively. W and H are
not more than 20.

There are H more lines in the data set, each of which
includes W characters. Each character represents the color of a
tile as follows.

'.' - a black tile

'#' - a red tile

'@' - a man on a black tile(appears exactly once in a data set)

The end of the input is indicated by a line consisting of two zeros.

Output

For each data set, your program
should output a line which contains the number of
tiles he can reach from the initial tile (including itself).

Sample Input

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0

Output for the Sample Input

45
59
6
13

Solution in JAVA (judge verdict: Wrong Answer)

import static java.lang.System.in;
import static java.lang.System.out;

import java.util.*;


public class Main {
	Scanner sc = new Scanner(in);
	
	void run() {
		StringTokenizer st;
		while (true) {
			st = new StringTokenizer(sc.nextLine());
			int w = Integer.parseInt(st.nextToken());
			int h = Integer.parseInt(st.nextToken());

			if (w == 0 && h == 0)
				break;
			boolean[][] room = new boolean[h][w];
			String s;
			int posx, posy;
			posx = posy = 0;
			for (int i = 0; i < h; i++) {
				s = sc.nextLine();
				for (int j = 0; j < w; j++) {
					if (s.substring(j,j+1).equals("."))
						room[i][j] = true;
					else if (s.substring(j,j+1).equals("@")) {
						room[i][j] = true;
						posx = i;
						posy = j;
					}
				}
			}

			
			int[] dx = {-1, 0, 1, 0};
			int[] dy = {0, -1, 0, 1};
			
			Queue<Integer> qx = new LinkedList<Integer>();
			Queue<Integer> qy = new LinkedList<Integer>();
			qx.add(posx);
			qy.add(posy);
			int ans = -1;
			int x, y;
			while (!qx.isEmpty()) {
				x = qx.poll();
				y = qy.poll();
				ans++;
				for (int i = 0; i < 4; i++) {
					if (x+dx[i] >= 0 && x+dx[i] < h 
							&& y+dy[i] >= 0 && y+dy[i] < w
							&& room[x+dx[i]][y+dy[i]]) {
						room[x+dx[i]][y+dy[i]] = false;
						qx.add(x+dx[i]);
						qy.add(y+dy[i]);
					}
				}
			}
			
			out.println(ans);
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().run();
	}
}