紅與黑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
..#.#..
..#.#..
###.###
###.###
..#.#..
..#.#..
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; }