总Time Limit:
1)‘.’:黑色的瓷砖;
2)‘#’:白色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 0 0
45-----------------------------------------------------------------------
而f(7,2)=f(7,1)+f(7,3)+f(6,2)+f(8,2) 等号两边出现了同样的式子 出现死循环
于是应该让已经走过的瓷砖被标记出来
#include <iostream>
using namespace std;
char a[22][22];
int W, H;
int f(int x, int y)
{
if(a[x][y] == '#')
return 0;
else
{
//此处之所以会溢出原因为没有将已经走过的标记出来,这样会造成死循环
if(x <= 0 || x >= H - 1 || y <= 0 || y >= W - 1 )
return 1;
else
{
a[x][y] = '#';
return 1 + f(x-1, y) + f(x+1, y) + f(x, y-1) + f(x, y+1);
}
}
}
int main()
{
while (true)
{
cin>>W>>H;
if ( 0 == W && 0 == H)
{
break;
}
int i,j;
int x, y;
for (i=0; i<H; i++)
{
for (j=0; j<W; j++)
{
cin>>a[i][j];
if ('@' == a[i][j])
{
x = i;
y = j;
}
}
}
cout<<f(x, y)<<endl;
}
return 0;
}