1. 程式人生 > >#125-(EZOI搜尋練習)[DFS]瓷磚

#125-(EZOI搜尋練習)[DFS]瓷磚

Description

在一個 w×h 的矩形廣場上,每一塊 1×1 的地面都鋪設了紅色或黑色的瓷磚。小林同學站在某一塊黑色的瓷磚上,他可以從此處出發,移動到上、下、左、右四個相鄰的且是黑色的瓷磚上。現在,他想知道,通過重複上述移動所能經過的黑色瓷磚數。

Input

第 1 行為 h、w,2≤w、h≤50,之間由一個空格隔開;

以下為一個 w 行 h 列的二維字元矩陣,每個字元為“.”“#”“@”,分別表示該位置為黑色的瓷磚、紅色的瓷磚、小林的初始位置。

Output

輸出一行一個整數,表示小林從初始位置出發經過的黑色瓷磚數。

 

Sample Input

11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#[email protected]#.#.
.#.#####.#.
.#.......#.
.#########.
...........

Sample Output

59

當年的DFS模板題.

#include <iostream>

#define SIZE 110

using namespace std;

int res;
bool a[SIZE][SIZE];
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

void dfs(int x, int y) // 深度優先搜尋
{
	int i;
	
	if (!a[x][y]) // 如果不能走就直接返回
	{
		return;
	}
	a[x][y] = false;
	++res; // 計數器
	for (i = 0; i < 4; ++i)
	{
		dfs(x + dx[i], y + dy[i]); // 四向搜尋
	}
	
	return;
}

int main(void)
{
	int n, m, i, j, sx, sy;
	char c;
	
	scanf("%d%d", &m, &n);
	for (i = 1; i <= n; ++i)
	{
		for (j = 1; j <= m; ++j)
		{
			cin >> c;
			if (c == '.')
			{
				a[i][j] = true;
			}
			else if (c == '@')
			{
				a[i][j] = true; // 起點
				sx = i;
				sy = j;
			}
		}
	}
	
	dfs(sx, sy);
	
	printf("%d", res);
	
	return 0;
}