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: Accepted)

using System;
class Program{
  
  static int w ,h;   
  static int wn, hn;
  static char [ ,]Dataset ;
  static bool [,] Counted ;
  static int output = 0;
  
  
  static void Main(string[] args){
    while (true){
      string[] read = Console.ReadLine().Split(' ');
      w = int.Parse(read[0]);
      h = int.Parse(read[1]);
      if(w == 0 || h == 0)break;
      
      Dataset = new char[w,h];
      for(int i = 0; i < h ; i++){
        string iread = Console.ReadLine();
        for(int j = 0; j< w ; j++){
          Dataset[j,i] = iread[j]; 
          if(Dataset[j,i] == '@' ){wn = j; hn = i;}
        }
      }
      
      Counted = new bool[w ,h] ;
      Check();
      Console.WriteLine(output);
      output = 0;
    }
    
    
  } 
  
  static void Check( ){
      Counted[wn,hn]= true;
      output ++;
      
        if(wn != 0 && !Counted[wn - 1 ,hn] && Dataset[wn -1,hn] != '#' ){
          wn --;Check();wn++;
        }if(hn != 0 && ! Counted[wn,hn - 1] && Dataset[wn,hn - 1] != '#'){
          hn --;Check();hn++;
        }if(wn != w - 1 && !Counted[wn + 1,hn] && Dataset[wn + 1,hn]  != '#'){
          wn ++;Check();wn--;
        }if(hn != h - 1 && !Counted[wn,hn + 1] && Dataset[wn,hn + 1] != '#'){
          hn ++;Check();hn--;
        }
    }
  
}
/*

    int a,b,c;
    a = int.Parse(Console.ReadLine()); //標準入力
    string[] str = Console.ReadLine().Split(' ');//2つ以上のスペース区切り入力の取得
    b = int.Parse(str[0]);  //数値で受け取りたい場合は変換する
    c = int.Parse(str[1]);
　　Console.Write("改行なし a = {0} b = {1} c = {2}", a, b, c)//改行なし出力
    Console.WriteLine("改行あり a = {0} b = {1} c = {2}", a, b, c);//改行付き出力

*/