[POJ] Lake Counting

本文介绍了一道经典的深度优先搜索(DFS)题目POJ2386的解题思路及实现代码。通过遍历矩阵寻找并标记所有相连的'W'字符,以此来解决岛屿数量的问题。

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

经典的dfs, dfs函数的作用是, 找到W附近八连通的所有W, 并将他们置为非W,以防重复访问, 这就好像一个传染的过程.

然后程序主体遍历矩阵的每一个点, 如果某个点是W就进行dfs传染, 并对num加1.  

曾经感觉最擅长的题, 刚才做起来竟然觉得生疏, 虽然过了是过了, 但没有秒杀很不爽, 我真是个沙茶.

 1 #include <algorithm>
 2 #include <cstdio>
 3 #include <queue>
 4 #include <vector>
 5 #include <cstring>
 6 #include <set>
 7 #include <string>
 8 using namespace std;
 9 
10 #define MAX_NUM 105
11 char ma[MAX_NUM][MAX_NUM] = {0};
12 int N = 0;
13 int M = 0;
14 int num = 0;
15 
16 void dfs(int x, int y) {
17     if (ma[x][y] == 'W') {
18         ma[x][y] = '.';
19         dfs(x - 1, y - 1);dfs(x - 1, y);dfs(x - 1, y + 1);
20         dfs(x, y - 1);                    dfs(x, y + 1);
21         dfs(x + 1, y - 1);dfs(x + 1, y);dfs(x + 1, y + 1);
22     } 
23 }
24 
25 void slove() {
26     for (int i = 1; i <= N; ++i) {
27         for (int j = 1; j <= M; ++j) {
28             if (ma[i][j] == 'W') {
29                 dfs(i, j);
30                 num += 1;
31             }
32         }
33     }
34 }
35 
36 int main()
37 {    
38     memset(ma, 0, sizeof(ma));
39     scanf("%d%d", &N, &M);
40     getchar();
41     for (int i = 1; i <= N; ++i) {
42         for (int j = 1; j <= M; ++j) {
43             ma[i][j] = getchar();
44         }
45         getchar();
46     }
47     slove();
48     printf("%d\n", num);
49     return 0;
50 }

 

转载于:https://www.cnblogs.com/NextLife/p/3413537.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值