poj 2816 紅與黑

總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 0
Sample 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;
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章