POJ 2386 Lake Counting


http://poj.org/problem?id=2386

思路 将联通的W变为 . dfs的次数 就是pound的个数

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 using namespace std;
 6 
 7 const int maxsize = 128;
 8 int M,N,cnt = 0;
 9 int d[2][8] = { {-1, -1, -1, 0, 1, 1, 1, 0},
10                 {-1, 0, 1, 1, 1, 0, -1, -1},
11               };
12 char court[maxsize][maxsize];
13 
14 //思路 : 随机选择一个水点 然后深搜将周围的所有水点变为.直到没有W为止
15 //那么深搜的次数 就是pound的个数
16 bool check(int x, int y)
17 {
18     if (x < 0 || x >= M || y < 0 || y >= N) return false;
19     if (court[x][y] == '.') return false;
20     return true;
21 }
22 void dfs(int x, int y)
23 {
24     int nx, ny;
25     court[x][y] = '.';//将相邻的所有W置为.
26     for (int i = 0; i <8; i++)
27     {
28         nx = x+d[0][i];
29         ny = y+d[1][i];
30         if (check(nx,ny))
31         {
32             dfs(nx, ny);
33         }
34     }
35 }
36 
37 int main()
38 {
39     //POJ是不能这样滴
40    #ifndef OLINE_JUDGE
41    freopen("in.txt", "r", stdin);
42    #endif // OLINE_JUDGE
43 
44    while (~scanf("%d%d", &M, &N))
45    {
46        cnt = 0;
47        getchar();
48        for (int i = 0;i < M; i++)
49        {
50            gets(court[i]);
51        }
52        while (1)
53        {
54            int x, y, s = 0;
55            for (int i = 0; i < M; i++)
56            {
57                for (int j = 0; j < N; j++)
58                {
59                    if (court[i][j] == 'W')
60                    {
61                        s++;
62                        x = i;
63                        y = j;
64                    }
65                }
66            }
67            if (s == 0) break;
68            dfs(x,y);
69            //for (int i = 0; i < M; i++) printf("%s\n",court[i]);
70            //putchar('\n');
71            cnt++;//进行多少次dfs()就有多少个pound
72        }
73        /*
74        改进:书上代码 自己想得太多
75        for (int i = 0; i < M; i++)
76         for (int j = 0; j < N; j++)
77        {
78          if (court[i][j] == 'W')
79          {
80             dfs(i,j);
81             cnt++;
82          }
83        }
84 
85        */
86        printf("%d\n", cnt);
87    }
88    return 0;
89 
90 }
91 //时间复杂度 因为每个格子至多被访问一次 然后会想8个方向搜索 所以时间复杂度 O(8*M*N)

优质内容筛选与推荐>>
1、(转)android import library switch语句报错case expressions must be constant expressions
2、世界上最便宜的10张防癌处方
3、JQuery 选择器
4、nginx安装
5、linux之查看系统命令


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号