有一个长方形的房间,上面铺着方砖。每一块瓷砖都是红色或黑色的。一个男人站在一块黑色的瓷砖上。从一个瓷砖,他可以移动到四个相邻瓷砖之一。但他不能在红瓦上移动,只能在黑瓦上移动。
编写一个程序,通过重复上述动作来计算他可以达到的黑色瓷砖的数量。
输入
输入由多个数据集组成。数据集以包含两个正整数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<stdio.h>
#include<string.h>
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;
}