#125-(EZOI搜尋練習)[DFS]瓷磚
阿新 • • 發佈:2018-11-09
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; }