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 Ruby (judge verdict: Accepted)

$stack = []
$x=0
$y=0
$cnt = 0

def calc(x,y)
	$stack.push([x,y])
	while $stack.size() != 0 do
		(posx,posy) = $stack.pop()
		if posx+1 < $x then
			check(posx+1,posy)
		end
		if posx-1 >= 0 then
			check(posx-1,posy)
		end
		if posy+1 < $y then
			check(posx,posy+1)
		end
		if posy-1 >= 0 then
			check(posx,posy-1)
		end
	end
end

def check(x,y)
	tmp = $bord[y][x]
	if tmp == 0 then
		$bord[y][x] = 2
		$stack.push([x,y])
		$cnt += 1
	end
end
	
loop{
	line = gets
	if line==nil then
		break
	end
	sp = line.split(nil)
	
	if sp.count() != 2 then
		break
	else
		$x = sp[0].to_i()
		$y = sp[1].to_i()
		if $x == 0 and $y == 0 then
			break
		end
		
		sx = 0
		sy = 0
		$cnt = 1 
		$bord = Array.new($y).map{Array.new($x,0)}
		for i in 1..$y
			line = gets
			for j in 0..$x-1
				tmp = 0
				if line[j] == "#" then
					tmp = 1
				elsif line[j] == "@" then
					tmp = 2
					sx = j
					sy = i-1
				end
				$bord[i-1][j] = tmp
			end
		end
		calc(sx,sy)
		print $cnt
		print("\n")
	end
}