1. 程式人生 > >紅與黑dfs

紅與黑dfs

題目描述 Description

有一個矩形房間,覆蓋正方形瓷磚。每塊瓷磚塗成了紅色或黑色。一名男子站在黑色的瓷磚上,由此出發,可以移到四個相鄰瓷磚之一,但他不能移動到紅磚上,只能移動到黑磚上。編寫一個程式,計算他通過重複上述移動所能經過的黑磚數。

 

輸入描述 Input Description

輸入包含多個數據集。一個數據集開頭行包含兩個正整數W和H,W和H分別表示矩形房間的列數和行數,且都不超過20.
每個資料集有H行,其中每行包含W個字元。每個字元的含義如下所示:
'.'——黑磚
'#'——紅磚
'@'——男子(每個資料集僅出現一次)
兩個0表示輸入結束。

輸出描述 Output Description

對每個資料集,程式應該輸出一行,包含男子從初始瓷磚出發可到達的瓷磚數。

樣例輸入 Sample Input

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#[email protected]#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###

[email protected]
###.###
..#.#..
..#.#..
0 0

樣例輸出 Sample Output

45
59
6
13

資料範圍及提示 Data Size & Hint

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

const int maxn = 20;
int H;
int W;
char s[maxn][maxn];
int ccount = 1;
int a[] = { 0,0,-1,1 };
int b[] = { -1,1,0,0 };


void dfs(int x, int y)
{
	s[x][y] = '#';
	
	for (int k = 0; k < 4; k++)
	{
		if (x + a[k] >= 0 && x + a[k] <= H - 1 && y + b[k] >= 0 && y + b[k] <= W - 1 && s[x + a[k]][y + b[k]] == '.')
		{
			ccount++;
			dfs(x + a[k], y + b[k]);
		}
		
	}

}

int main()
{
	int i, j;
	int m, n;
	while (scanf("%d%d", &W, &H) != EOF && H != 0 && W != 0)
	{
		getchar();//吸收回車
		for (i = 0; i < H; i++)
		{
			for (j = 0; j < W; j++)
			{
				scanf("%c", &s[i][j]);
				if (s[i][j] == '@')
				{
					m = i;//記錄初始位置
					n = j;
				}
			}
			getchar();
		}
		dfs(m, n);
		printf("%d\n", ccount);
		ccount = 1;//男子的初始位置也是一個黑磚
	}
			return 0;

	}