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

<?php

function move($x, $y, $map, &$visit){
    // x,y 座標
    // map 与えられた地図
    // visit 塗りつぶした箇所の地図（情報）
    $dx = [1,-1,0,0];
    $dy = [0,0,1,-1];
    // 上下左右（xとy）で動きを表現する。
    if (($map[$y][$x] == '.' || $map[$y][$x] == '@') && $visit[$y][$x] == false){
        $visit[$y][$x] = true;
        for ($i = 0; $i < 4; $i++){
            if(($x + $dx[$i] < count($map[$y]) && $x + $dx[$i] >= 0) && ($y + $dy[$i] < count($map) && $y + $dy[$i] >= 0)){
                // printmap($visit);
                move($x + $dx[$i], $y + $dy[$i], $map, $visit);
            }
        }
    }
}

function printmap($map){
    foreach($map as $ma){
        foreach($ma as $m){
            if($m){
                echo 'X';

            } else {
                echo '.';
            }
        }
        echo "\n";
    }
}


$numbers = preg_split("/[\s,]+/", rtrim(fgets(STDIN)));
$w = intval($numbers[0]);
$h = intval($numbers[1]);

while ($w != 0){
    $map = [];
    for ($i = 0; $i < $h; $i++){
        $ar = [];
        for ($j = 0; $j < $w; $j++){
            $ar[] = ' ';
        }
        $map[] = $ar;
    }
    $visit = [];
    for ($i = 0; $i < $h; $i++){
        $ar = [];
        for ($j = 0; $j < $w; $j++){
            $ar[] = false;
        }
        $visit[] = $ar;
    }
    $visit1 =& $visit;

    $x = 0;
    $y = 0;
    for ($i = 0; $i < $h; $i++){
        $c = rtrim(fgets(STDIN));
        for ($j = 0; $j < $w; $j++){
            $map[$i][$j] = substr($c, $j, 1);
            if($map[$i][$j] == '@'){
                $x = $j;
                $y = $i;
            }
        }
    }

    // printmap($map);
    // exit;

    $count = 0;
    move($x, $y, $map, $visit1);
    // printmap($visit1);
    foreach ($visit1 as $vi){
        foreach ($vi as $v){
            if ($v){
                $count += 1;
            }
        }
    }
    echo $count;
    echo "\n";

    $numbers = preg_split("/[\s,]+/", rtrim(fgets(STDIN)));
    $w = intval($numbers[0]);
    $h = intval($numbers[1]);
}