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)

 

posted @ 2017-01-16 23:47  Lorazepam  阅读(259)  评论(0编辑  收藏  举报