POJ_2386: Lake Counting

来源:互联网 发布:动网论坛 php 编辑:程序博客网 时间:2024/05/17 23:50

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: 

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

Source

USACO 2004 November

备注:简单的dfs数连通分量个数。

#include<stdio.h>#define LAND -1#define WATER 1int N,M;int graph[101][101];int visited[101][101];void dfs(int startA,int startB){visited[startA][startB]=true;if(startA-1>=0 && !visited[startA-1][startB] && graph[startA-1][startB]==WATER)dfs(startA-1,startB);if(startA+1<N && !visited[startA+1][startB] && graph[startA+1][startB]==WATER)dfs(startA+1,startB);if(startB-1>=0 && !visited[startA][startB-1] && graph[startA][startB-1]==WATER)dfs(startA,startB-1);if(startB+1<M && !visited[startA][startB+1] && graph[startA][startB+1]==WATER)dfs(startA,startB+1);if(startA-1>=0 && startB-1>=0 && !visited[startA-1][startB-1] && graph[startA-1][startB-1]==WATER)dfs(startA-1,startB-1);if(startA-1>=0 && startB+1<M && !visited[startA-1][startB+1] && graph[startA-1][startB+1]==WATER)dfs(startA-1,startB+1);if(startA+1<N && startB-1>=0 && !visited[startA+1][startB-1] && graph[startA+1][startB-1]==WATER)dfs(startA+1,startB-1);if(startA+1<N && startB+1<M && !visited[startA+1][startB+1] && graph[startA+1][startB+1]==WATER)dfs(startA+1,startB+1);}int main(){scanf("%d %d",&N,&M);getchar();for(int i=0;i<N;i++){for(int j=0;j<M;j++){char c;c=getchar();if(c=='.')graph[i][j]=LAND;else if(c=='W')graph[i][j]=WATER;visited[i][j]=false;}getchar();}//count connected components using dfsint count=0;for(int i=0;i<N;i++)for(int j=0;j<M;j++){if(!visited[i][j] && graph[i][j]==WATER){dfs(i,j);count++;}}printf("%d\n",count);return 0;}


原创粉丝点击