深搜红与黑

有一个长方形的房间,上面铺着方砖。每一块瓷砖都是红色或黑色的。一个男人站在一块黑色的瓷砖上。从一个瓷砖,他可以移动到四个相邻瓷砖之一。但他不能在红瓦上移动,只能在黑瓦上移动。             
 编写一个程序,通过重复上述动作来计算他可以达到的黑色瓷砖的数量。             

输入
输入由多个数据集组成。数据集以包含两个正整数W和H的行开头;W和H分别是x和y方向上的平铺数。W和H不超过20。 数据集中还有H行,每行包含W个字符。每个字符代表一个瓷砖的颜色,如下所示。
‘.’-一块黑色的瓷砖
“35;”-红色瓷砖
“@”-一个站在黑色瓷砖上的人(在数据集中只出现一次) 输出
对于每个数据集,您的程序应该输出一行,其中包含他可以从初始平铺(包括其本身)到达的平铺数.
Sample Input
6 9
…#.
…#





#@…#
.#…#.
11 9
.#…
.#.#######.
.#.#…#.
.#.#.###.#.
.#.#…@#.#.
.#.#####.#.
.#…#.
.#########.

11 6
…#…#…#…
…#…#…#…
…#…#…###
…#…#…#@.
…#…#…#…
…#…#…#…
7 7
…#.#…
…#.#…
###.###
…@…
###.###
…#.#…
…#.#…
0 0
Sample Output
45
59
6
13

#include
#include
int book[100][100];
char A[100][100];
int a,b;
void dfs(int x,int y,int step)
{
     
	int i,tx,ty;
	int dir[4][2]={
     {
     1,0},{
     0,1},{
     -1,0},{
     0,-1}};
	for(i=0;i<4;i++)
	{
     
		tx=x+dir[i][0];
		ty=y+dir[i][1];
		if(A[tx][ty]=='.'&&book[tx][ty]==0&&tx>=0&&ty>=0&&tx<b&&ty<a)
		{
     
			book[tx][ty]=1;
			dfs(tx,ty,step+1);
		}
	}
	return;
}
int main()
{
     
	int x,y,q;
	while(~scanf("%d%d",&a,&b)&&(a+b)!=0)
	{
     
		q=0;
		memset(book,0,sizeof book);
		for(int i=0;i<b;i++)
		scanf("%s",&A[i]);
		for(int i=0;i<b;i++)
		for(int j=0;j<a;j++)
		{
     
			if(A[i][j]=='@')
			{
     
				x=i;y=j;
				book[x][y]=1;
			}
		}
		dfs(x,y,1);
		for(int i=0;i<b;i++)
		{
     
			for(int j=0;j<a;j++)
			{
     
				if(book[i][j]==1)
				q++;
			}
		}
		printf("%d\n",q);
	}
	return 0;
}

你可能感兴趣的:(深搜红与黑)