分析题目:
用dfs实现FloodFill。
@和.实际上都是表示该格可走,#则表示该格不能走,想到用 bool map[i][j] 存储是否可走。
用visit[i][j]表示是否已经访问过。
从一个黑格只能到达上,下,左,右四块相邻的格,该格应该未访问过且该格不能是红格。
inmap(i, j)判断该格是否在map中。
解题代码:
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 5 bool map[22][22]; 6 bool visit[22][22]; 7 int answer; 8 int W, H; // W->cols, H->rows 9 int dr[4] = {0, 1, -1, 0}; 10 int dc[4] = {-1, 0, 0, 1}; 11 12 bool inmap(int r, int c) 13 { 14 if(r>=1 && r<=H && c>=1 && c<=W) 15 return true; 16 else 17 return false; 18 } 19 20 void dfs(int now_r, int now_c) 21 { 22 for(int i=0; i<4; i++) 23 { 24 int r = now_r + dr[i]; 25 int c = now_c + dc[i]; 26 if(inmap(r,c) && map[r][c] && !visit[r][c]) 27 { 28 answer++; 29 visit[r][c] = true; 30 dfs(r, c); 31 } 32 33 } 34 } 35 36 int main() 37 { 38 int i, j, start_r, start_c; 39 while( cin >> W >> H) 40 { 41 if(W == 0 && H == 0) 42 break; 43 memset(visit, false, sizeof(visit)); 44 45 for(i=1; i<=H; i++) 46 for(j=1; j<=W; j++) 47 { 48 char c; 49 cin >> c; 50 if(c == ‘.‘) 51 map[i][j] = true; 52 else 53 { 54 if(c == ‘#‘) 55 map[i][j] = false; 56 else 57 { 58 map[i][j] = true; 59 visit[i][j] = true; 60 start_r = i; 61 start_c = j; 62 } 63 } 64 } 65 answer = 1; 66 dfs(start_r, start_c); 67 cout << answer << endl; 68 } 69 70 return 0; 71 }
时间: 2024-10-22 01:53:25