總Time Limit:
1000ms Memory Limit: 65536k Description 有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫一個程序,計算你總共能夠到達多少塊黑色的瓷磚。 Input 包括多個數據集合。每個數據集合的第一行是兩個整數W和H,分別表示x方向和y方向瓷磚的數量。W和H都不超過20。在接下來的H行中,每行包括W個字符。每個字符表示一塊瓷磚的顏色,規則如下1)‘.’:黑色的瓷磚;
2)‘#’:白色的瓷磚;
3)‘@’:黑色的瓷磚,並且你站在這塊瓷磚上。該字符在每個數據集合中唯一出現一次。
當在一行中讀入的是兩個零時,表示輸入結束。
Output 對每個數據集合,分別輸出一行,顯示你從初始位置出發能到達的瓷磚數(記數時包括初始位置的瓷磚)。 Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 0 0Sample Output
45----------------------------------------------------------------------- 考慮三種情況 一是在邊框之外的 一個是'#' 一個'.' 之前寫好了一版 但是死循環了 究其原因原來是在遞歸的過程中 比如說f(7,3)=f(7,2)+f(7,4)+f(6,3)+f(8,3)
而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;
}