首页 > 代码库 > POJ2386 Lake Counting 【DFS】

POJ2386 Lake Counting 【DFS】

Lake Counting
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 20782 Accepted: 10473

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 12
W........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: 

There are three ponds: one in the upper left, one in the lower left,and one along the right side.

Source

USACO 2004 November

睡前水一水。

#include <stdio.h>
#include <string.h>

#define maxn 102

char G[maxn][maxn];
int n, m;
const int mov[][2] = {0, 1, 0, -1, 1, 0, -1, 
				0, 1, -1, -1, 1, 1, 1, -1, -1};

void DFS(int x, int y) {
	G[x][y] = '.';
	int i, j, nx, ny;
	for(i = 0; i < 8; ++i) {
		nx = x + mov[i][0];
		ny = y + mov[i][1];
		if(nx >= 0 && nx < n && ny >= 0 && ny < m && G[nx][ny] == 'W')
			DFS(nx, ny);
	}
}

int main() {
	int i, j, ret;
	while(scanf("%d%d", &n, &m) == 2) {
		for(i = 0; i < n; ++i)
			scanf("%s", G[i]);
		ret = 0;
		for(i = 0; i < n; ++i)
			for(j = 0; j < m; ++j)
				if(G[i][j] == 'W') {
					DFS(i, j);
					++ret;
				}
		printf("%d\n", ret);
	}
	return 0;
}


POJ2386 Lake Counting 【DFS】