Lake Counting (POJ No.2386)

有一个大小为N*M的园子,雨后积起了水,八连通的积水被认为是链接在一起的求出园子里一共有多少水洼?

***

*W*

***

 

/**
*进行深度优先搜索,从第一个W开始,将八个方向可以到达的 W修改为 .
*每次进行深度优先搜索的时候就将链接的水坑换成了.
*进行的深度优先搜索的次数就是水坑数 
*/
#include<stdio.h>
#include<string.h>
const int  MAX=100; 
int N,M;
char filed[MAX][MAX];  //园子的构造 
//现在的位置(x,y)
void dfs(int x,int y){
    //将现在所在的位置替换为‘.’
    filed[x][y]='.';
    //循环遍历移动的8个方向
    for(int dx=-1;dx<=1;dx++){
        for(int dy=-1;dy<=1;dy++){
            int nx=x+dx,ny=y+dy;
            //判断(nx,ny是不是在园子内,以及是否有积水)
            if(0<=nx && nx<N && 0<=ny && ny<M && filed[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(filed[i][j]=='W'){
                dfs(i,j);      //从有积水的地方开始遍历,遍历的次数就是水坑的个数 
                res++;
            }
        }
    printf("%d\n",res);
}
int main(){
    while(scanf("%d%d",&N,&M)==2){
        getchar();
        for(int i=0;i<N;i++)
            for(int j=0;j<M;j++)
                scanf("%c",&filed[i][j]);
        solve();
    }
    return 0;
} 

 

posted @ 2015-04-09 21:17  sky-zz  阅读(286)  评论(0编辑  收藏  举报