Lake Counting(POJ NO.2386)

有一个大小为n*m的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对w的*的部分)
***
*w*
***
限制条件:n,m<=100
思路:
1.遍历整个园子。遇到w就进行dfs,同时水坑数+1
2.dfs函数:
1)把w变成”.“。
2)遍历四个方向,寻找符合的方向(不超出边界,该位置是“w"),把符合的方向的坐标作为递归的参数
3)递归dfs函数

#include<iostream>
using namespace std;
char field [20][25]; // 园子
// 现在位置(x,y)
int M,N;
void dfs(int x,int y) 
{
    //将现在的位置替换为 .
    field[x][y]='.';

    // 循环遍历一定的八个方向
    for(int dx=-1;dx<=1;dx++)
        for(int dy=-1;dy<=1;dy++) 
        {
            // 向x的方向移动dx 向y的方向移动dy 移动的结果为 (nx,ny)
            int nx = x +dx,ny =  y+dy;
            //判断(nx,ny)是否在园子内  以及是否有积水 
            if(0<=nx && nx< N && 0<=ny && ny < M && field[nx][ny]=='W')
                dfs(nx,ny);
        }
        return ;
}
int main() 
{

    cin >> M >> N ;


    int res = 0;
    for(int i=0;i
        for(int j=0;j
        {
            cin >> field[i][j] ;
            if(field[i][j] == 'W'){
                //从有W的地方开始dfs
                    dfs(i,j);
                    res++;
            }
        }
}

你可能感兴趣的:(挑战程序设计,poj)