首页 > 其他 > 详细

AOJ 0118 深度优先搜索DFS

时间:2014-03-11 14:08:57      阅读:506      评论:0      收藏:0      [点我收藏+]

日文题。。。

题意:一个面积为H*W的果园,种了苹果,梨和蜜柑。相邻(上下左右)的果树属于同一个区域,问果园共有多少个区域。

分析:迷宫问题。对于每一个格子,可以用深度优先搜索把相同果树的格子遍历并标记。也就是说,每做一次DFS,消灭掉一个区域。只需要遍历果园,对每一个未被标记的格子做DFS,做DFS的次数就是果园的区域数。这里不需要另外用其他数组标记格子已访问,只需要将格子的元素改为一个不会出现的元素如1即可。

C++代码:

bubuko.com,布布扣
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 const int MAX_H = 100;
 5 const int MAX_W = 100;
 6 
 7 //输入
 8 int H, W;
 9 char g[MAX_H][MAX_W + 1];
10 
11 int d[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};        //方向
12 
13 //深度优先遍历g[i][j]同类局域
14 void dfs(int x, int y, int c){
15     for(int i = 0; i < 4; i ++){
16         int nx = x + d[i][0], ny = y + d[i][1];
17         if(0 <= nx && nx < H && 0 <= ny && ny < W && g[nx][ny] == c){
18             g[nx][ny] = 1;
19             dfs(nx, ny, c);
20         }
21     }
22 }
23 
24 void solve(){
25     //遍历果园,每到一个新位置,遍历该位置能到达的地方
26     int ans = 0;
27     for(int i = 0; i < H; i ++){
28         for(int j = 0; j < W; j ++){
29             if(g[i][j] != 1){
30                 ans ++;
31                 char c = g[i][j];
32                 g[i][j] = 1;
33                 dfs(i, j, c);
34             }
35         }
36     }
37     printf("%d\n", ans);
38 }
39 
40 int main(int argc, char const *argv[]){
41 
42     while(scanf("%d %d", &H, &W)){
43         if(H == 0 && W == 0) break;
44         for(int i = 0; i < H; i ++){
45             scanf("%s", g[i]);
46         }
47         solve();
48     }
49 
50     return 0;
51 }
bubuko.com,布布扣

AOJ 0118 深度优先搜索DFS,布布扣,bubuko.com

AOJ 0118 深度优先搜索DFS

原文:http://www.cnblogs.com/7hat/p/3585902.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!