POJ 1979 深度优先搜索
题意:有红色和黑色的格子,只能走黑色的,问从起始位置出发,最多能走到达多少块黑色格子。
分析:相当于走迷宫,黑色格子是路,红色格子是墙,每次到达一个未到达过的格子时计数,原点也算是一个。每次可以走上下左右四个方向,用深度优先遍历从原点起始,一直到遍历所有能到达的格子。需要注意的是,不要重复走同一个格子,可以采取数组标记已走过的格子,但这里只需简单将已走过的格子标记为红色就可以达到目的,因为红色的格子也不可走。
C++代码:
1 #include <cstdio> 2 3 const int MAX_W = 20; 4 const int MAX_H = 20; 5 6 //输入 7 int W; 8 int H; 9 char maze[MAX_H][MAX_W + 1]; 10 11 //4个方向 12 const int d[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}}; 13 14 int dfs(int x, int y){ 15 int ans = 0; 16 for(int i = 0; i < 4; i ++){ 17 int nx = x + d[i][0], ny = y + d[i][1]; 18 if(0 <= nx && nx < H && 0 <= ny && ny < W && maze[nx][ny] == '.'){ 19 ans ++; 20 maze[nx][ny] = '#'; 21 ans += dfs(nx, ny); 22 } 23 } 24 return ans; 25 } 26 27 void solve(){ 28 //找出起始位置 29 int sx, sy; 30 for(int i = 0; i < H; i ++){ 31 for(int j = 0; j < W; j ++){ 32 if(maze[i][j] == '@'){ 33 sx = i; 34 sy = j; 35 break; 36 } 37 } 38 } 39 //深度优先遍历,每到一个新位置就计数 40 int ans = 1 + dfs(sx, sy); 41 printf("%d\n", ans); 42 } 43 44 int main(int argc, char const *argv[]){ 45 46 while(scanf("%d %d", &W, &H)){ 47 if(W == 0 && H == 0) break; 48 for(int i = 0; i < H; i ++) 49 scanf("%s", maze[i]); 50 solve(); 51 } 52 53 return 0; 54 }