题目传送门:http://poj.org/problem?id=2386
题目大意:给你一张图代表农民的田地,其中'W'代表有水的格子,‘.’代表干地。有水的格子连在一起就是一个水池,问给定的一块土地上有几个水池。
题目思路:
实际是是个很简单的题目,貌似是用BFS做,但是我还没想好,稍后奉上BFS版本。
我用的是DFS做的,把 图读完之后,开始遍历,遇到W字符的时候开始进行深搜,每次向八个方向进行深搜,每次把W的地方标记好,直到搜到八个方向都没有没有搜索过的带有W的点,或者都是干地,那么退出,算一个池塘,计数+1.之后再继续进行遍历,直到把 图遍历完,答案也就出来了。这里我感觉,题目的意思应该是一个带有w的格子也算作 是一个水池,不一定要连接几个有W的格子以上才叫做水池,事实上,在遍历的过程中,只要遇到W的格子就算作一个水池,DFS只不过是用于把他周围的W格子全都标记,以至于下次在搜索的时候不会再计数。
代码如下:
//Lake Counting// //题目链接:http://poj.org/problem?id=2386 #include<stdio.h> #include<string.h> char map[150][150]; bool vis[150][150]; int x_move[8]={0,0,-1,1,-1,1,-1,1}; int y_move[8]={1,-1,0,0,1,1,-1,-1}; int N,M; int count; int is_water(int a,int b) { if(map[a][b]=='W') return 1; else return 0; } void DFS(int x,int y) { int i; int tx,ty; if(map[x][y]=='.') return ; for(i=0;i<8;i++) { tx=x+x_move[i]; ty=y+y_move[i]; if(tx<1||tx>N||ty<1||ty>M) //不超边界 continue; if(is_water(tx,ty)&&vis[tx][ty]==0) { vis[tx][ty]=1; DFS(tx,ty); } } } int main() { int i,j; while(scanf("%d%d",&N,&M)!=EOF) { getchar(); count=0; memset(vis,0,sizeof(vis)); for(i=1;i<=N;i++) { for(j=1;j<=M;j++) scanf("%c",&map[i][j]); getchar(); } for(i=1;i<=N;i++) { for(j=1;j<=M;j++) { if(map[i][j]=='W'&&vis[i][j]==0) { count++; vis[i][j]=1; DFS(i,j); } } } printf("%d\n",count); } return 0; }