Bailian2816 紅與黑【DFS】
阿新 • • 發佈:2018-12-24
2816:紅與黑
總時間限制: 1000ms 記憶體限制: 65536kB
描述
有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫一個程式,計算你總共能夠到達多少塊黑色的瓷磚。
輸入
包括多個數據集合。每個資料集合的第一行是兩個整數W和H,分別表示x方向和y方向瓷磚的數量。W和H都不超過20。在接下來的H行中,每行包括W個字元。每個字元表示一塊瓷磚的顏色,規則如下
1)‘.’:黑色的瓷磚;
2)‘#’:白色的瓷磚;
3)‘@’:黑色的瓷磚,並且你站在這塊瓷磚上。該字元在每個資料集合中唯一出現一次。
當在一行中讀入的是兩個零時,表示輸入結束。
輸出
對每個資料集合,分別輸出一行,顯示你從初始位置出發能到達的瓷磚數(記數時包括初始位置的瓷磚)。
樣例輸入
6 9
....#.
.....#
......
......
......
......
......
@...
.#..#.
0 0
樣例輸出
45
來源
1979
問題連結:Bailian2816 紅與黑
問題描述:(略)
問題分析:
這是一個可以用DFS解決的問題,不解釋了。
程式說明:
本題與參考連結是同一題,使用參考連結的程式提交就AC了。
參考連結:POJ1979 HDU1312 Red and Black【DFS】
題記:朋友交多了,容易遇見熟人。
AC的C語言程式如下:
/* POJ1979 Red and Black */ #include <stdio.h> #include <memory.h> #define DIRECTSIZE 4 struct direct { int drow; int dcol; } direct[DIRECTSIZE] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}}; #define MAXN 20 char grid[MAXN+2][MAXN+2]; int count; void dfs(int row, int col) { int i; for(i=0; i<DIRECTSIZE; i++) { int nextrow = row + direct[i].drow; int nextcol = col + direct[i].dcol; if(grid[nextrow][nextcol] == '.') { count++; grid[nextrow][nextcol] = '#'; dfs(nextrow, nextcol); } } } char getmychar() { char c; while((c=getchar()) && (c == '\n' || c == '\t' || c == ' ')); return c; } int main(void) { int w, h, startrow, startcol, i, j; while(scanf("%d%d", &w, &h) != EOF) { // 結束條件 if(w == 0 && h == 0) break; // 清零:邊界清零 memset(grid, 0, sizeof(grid)); // 讀入資料 for(i=1; i<=h; i++) for(j=1; j<=w; j++) { grid[i][j] = getmychar(); if(grid[i][j] == '@') { startrow = i; startcol = j; grid[i][j] = '#'; } } // 計數置1 count = 1; // 深度優先搜尋 dfs(startrow, startcol); // 輸出結果 printf("%d\n", count); } return 0; }