DFS------Lake Counting

来源:互联网 发布:java中重载的用法 编辑:程序博客网 时间:2024/06/05 05:52

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

Lake Counting
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 20206 Accepted: 10182

Description

Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors. 

Given a diagram of Farmer John's field, determine how many ponds he has.

Input

* Line 1: Two space-separated integers: N and M 

* Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.

Output

* Line 1: The number of ponds in Farmer John's field.

Sample Input

10 12W........WW..WWW.....WWW....WW...WW..........WW..........W....W......W...W.W.....WW.W.W.W.....W..W.W......W...W.......W.

Sample Output

3

Hint

OUTPUT DETAILS: 

bfs模板吧,做了一个小时,我也是无语.加了两个判断,应该是这两个判断弄混淆了.

再写一个判断试试看.第一个是



#include<iostream>using namespace std;char a[200][200];int n, m;void bfs(int i, int j){if (a[i][j] == '.')return;else{a[i][j] = '.';bfs(i + 1, j);bfs(i + 1, j + 1);bfs(i + 1, j - 1);bfs(i , j - 1);bfs(i , j + 1);bfs(i - 1, j+1);bfs(i - 1, j-1);bfs(i - 1, j);}}int main(){while (cin >> n >> m){memset(a, '.', sizeof(a));for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> a[i][j];}}int num = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (a[i][j] == 'W'){bfs(i, j);num++;}}}cout << num << endl;}}


用vis标记


#include<iostream>using namespace std;char a[200][200];int vis[200][200];int n, m;void bfs(int i, int j){if (a[i][j] == '.'||i<1||i>n||j<1||j>m||vis[i][j]==1)return;else{vis[i][j] = 1;bfs(i + 1, j);bfs(i + 1, j + 1);bfs(i + 1, j - 1);bfs(i , j - 1);bfs(i , j + 1);bfs(i - 1, j+1);bfs(i - 1, j-1);bfs(i - 1, j);}}int main(){while (cin >> n >> m){memset(a, '.', sizeof(a));for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> a[i][j];}}memset(vis, 0, sizeof(vis));int num = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (a[i][j] == 'W'&&vis[i][j]==0){bfs(i, j);num++;}}}cout << num << endl;}}



0 0