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 C++ (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cctype>

#include <iostream>
#include <vector>
#include <deque>
#include <queue>
#include <map>
#include <algorithm>

using namespace std;

#define rep(i, n) for(int i = 0; i < n; i++)
#define repi(i,l,n) for(int (i)=(int)(l);(i)<(int)(n);(i)++)
#define d_arr(arr, h, w) rep(i,(h) ){ cout << "["; rep(j,(w) ) { cout << (arr)[i][j] << ", "; } cout << "]" << endl;}
#define IN(x,s,g) ((x) >= (s) && (x) < (g))
#define ISIN(x,y,w,h) (IN((x),0,(w)) && IN((y),0,(h)))
#define print(x) printf("%d\n",x);
#define fs first
#define sc second

typedef pair<int ,int> P;

char grid[20][20];
bool arrived[20][20];
int dx[4] ={1,0,-1,0};
int dy[4] ={0,1,0,-1};
int w,h;

//i,jから初めて到達可能なタイルの数の最大値(i,j)含む
void rec(int i,int j){
//    printf("i:%d j:%d\n",i,j);
    arrived[i][j] = true;
    grid[i][j] = '#';
    int ret = 0;
    rep(k,4) {
        int next_j = j+dx[k];
        int next_i = i+dy[k];
        if( next_j < w && 0 <= next_j &&
            next_i < h && 0 <= next_i &&
            grid[next_i][next_j] == '.')
        {
            rec(next_i,next_j);
        }
    }
}

int main()
{
    P start;
    while(1){
        cin >> w >> h;
        rep(i,20) rep(j,20) arrived[i][j] = false;
        rep(i,h){
            rep(j,w){
                cin >> grid[i][j];
                if( grid[i][j] == '@' ){ start.first=i;start.second=j; }
            }
        }
        rec(start.first,start.second);
        int ret=0;
        rep(i,20){
            rep(j,20){
                if(arrived[i][j] == true ){
                    ret+=1;
                }
            }
        }
        cout << ret << endl;
    }
}