POJ 2386 Lake Counting

来源:互联网 发布:警方破特大网络赌球 编辑:程序博客网 时间:2024/04/19 02:25

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

Solutions

使用深度优先搜索(DFS,Depth-First Search),一次深度优先搜索中将与'W'相邻的'W'全部换成'.',遍历整个地图,进行几次深度优先搜索即为有几个池子。

Source Code

#include<iostream> #include<cstdio>#include<vector>#include<algorithm>#include<queue> #include<cmath>using namespace std;#define MAX 0x7f7f7f7fchar map[101][101];int n,m;void dfs(int x, int y) {    map[x][y] = '.';    for (int dx = -1; dx <= 1; dx++) {        for (int dy = -1; dy <= 1; dy++) {            int nx = x + dx;            int ny = y + dy;            if (nx >= 0 && nx < n && ny >= 0 && ny < m && map[nx][ny] == 'W') {                dfs(nx, ny);            }        }    }}int main() {    cin >> n >> m;    for (int i = 0; i < n; i++) {        for (int j = 0; j < m; j++) {            cin >> map[i][j];        }    }     int time = 0;    for (int i = 0; i < n; i++) {        for (int j = 0; j < m; j++) {            if (map[i][j] == 'W') {                time++;                dfs(i, j);            }        }    }     cout << time << endl;    return 0;}
0 0