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 }

 

 

 

posted @ 2014-03-06 08:24  7hat  阅读(458)  评论(0编辑  收藏  举报