POJ-2386.Lakecounting(DFS求连通块)

  本题是一道连通块的入门题,用来练手,后续还会更新连通块的题目。

  本题大意:一个n * m 的陆地上面有很多水洼,让你统计水洼的个数并输出。

  本题思路:按照顺序遍历陆地,如果发现水洼就将它的八连块都进行探索,发现水洼就继续探索,直到一片大水洼都被探索完,就继续进行其他搜索,DFS。

  代码:

 1 #include <cstdio>
 2 using namespace std;
 3 
 4 const int maxn = 100 + 5;
 5 char field[maxn][maxn];
 6 int n, m, ans;
 7 
 8 void dfs(int u, int v) {
 9     field[u][v] = '.';//将正在探索的水洼变为陆地,方便后续查询
10     for(int dx = -1; dx <= 1; dx ++) {
11         for(int dy = -1; dy <=1; dy ++) {
12             int nx = u + dx, ny = v + dy;
13             if(nx >= 0 && nx < n && ny >= 0 && ny < m && field[nx][ny] == 'W')
14                 dfs(nx, ny);
15         }
16     }
17 }
18 
19 int main () {
20     ans = 0;
21     scanf("%d %d", &n, &m);
22     getchar();
23     for(int i = 0; i < n; i ++) {
24         for(int j = 0; j < m; j ++)
25             field[i][j] = getchar();
26         getchar();
27     }
28     for(int i = 0; i < n; i ++)
29         for(int j = 0; j < m; j ++)
30             if(field[i][j] == 'W') {//如果一个地方为水洼,则将和他连在一起的所有水洼都变为陆地,方便后续的统计
31                 dfs(i, j);
32                 ans ++;
33             }
34     printf("%d\n", ans);
35     return 0;
36 }
View Code

   还有一道题HDU1241和这道题一模一样,建议大家二选一即可。

posted @ 2019-03-05 11:04  Cruel_King  阅读(174)  评论(0编辑  收藏  举报