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)

#include <bits/stdc++.h>

using namespace std;

class P
{
public:
	int x,y;
	P(int X,int Y)
	{
		x=X;
		y=Y;
	}
};

int main()
{
	stack<P>st;
	int n,m;
	int numX[4]={0,1,0,-1};
	int numY[4]={1,0,-1,0};

	while(cin>>n>>m && n)
	{
		int flag[500][500]={};
		int count=0;
		string in;
		char set[500][500]={};

		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=n;j++)
			{
				cin >> set[i][j];
			}
		}

		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(set[i][j]=='@')
				{
					st.push(P(j,i));
					flag[i][j]=1;
				}
			}
		}

		int xx,yy;

		while(!st.empty())
		{
			count++;
			xx=st.top().x;
			yy=st.top().y;
			st.pop();
			for(int i=0;i<4;i++)
			{
				if(set[numY[i]+yy][numX[i]+xx]=='.' && flag[numY[i]+yy][numX[i]+xx]==0)
				{
					st.push(P(numX[i]+xx,numY[i]+yy));
					flag[numY[i]+yy][numX[i]+xx]=1;
				}
			}

		}
		cout << count << endl;
	}

    return 0;
}