Lake Counting(POJ NO.2386)

本文介绍了一种通过深度优先搜索算法(DFS)来计算一个二维园地中水洼数量的方法。园地由字符数组表示,其中 'W' 表示积水,'. ' 表示干燥地面。采用八连通准则,即八个相邻方向都可视为相连,从而确定水洼的边界。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个大小为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<M;i++) 
        for(int j=0;j<N;j++) 
        {
            cin >> field[i][j] ;
            if(field[i][j] == 'W'){
                //从有W的地方开始dfs
                    dfs(i,j);
                    res++;
            }
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值