首页 > 代码库 > Lake Counting (POJ No.2386)
Lake Counting (POJ No.2386)
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.
Given a diagram of Farmer John‘s field, determine how many ponds he has.
中文题目:
有一个大小为N×M的园子,雨后积起了水,被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对W的*部分)
***
*W*
***
注:水洼指八个方向能连在一起W,入下面的输入有三个八个方向能连在一起的水洼。
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.
* 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
分析:
深度优先搜索:
尽可能“深“的遍历一个图,在深度优先搜索中,对于最新已经发现的顶点,如果它的邻接顶点未被访问,则深度优先搜索该邻接顶点。
该题即利用深度优先搜索一个水洼即一次深度优先搜索,将搜索到的"W"变成".",遍历数组,能进行几次深度优先搜索就有几个水洼。
代码如下:
#include <iostream> #include <stdio.h> #define MAX_N 100 #define MAX_M 100 using namespace std; int N,M; char field[MAX_N][MAX_M+1]; void solve(); int main() { while(scanf("%d%d",&N,&M)!=EOF){ for(int i=0;i<N;i++){ scanf("%s",field[i]); } solve(); } return 0; } void dfs(int x,int y){ field[x][y]=‘.‘; for(int dx=-1;dx<=1;dx++){ for(int dy=-1;dy<=1;dy++){ int nx=x+dx,ny=y+dy; if(nx>=0&&nx<N&&ny>=0&&ny<M&&field[nx][ny]==‘W‘){ dfs(nx,ny); } } } return; } void solve() { int res=0; for(int i=0;i<N;i++){ for(int j=0;j<M;j++){ if(field[i][j]==‘W‘){ dfs(i,j); res++; } } } printf("%d\n",res); }
Lake Counting (POJ No.2386)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。