池塘计数 (DFS)

农夫约翰在N*M矩形土地上的池塘计数问题,通过DFS算法查找相连的'W'单元格形成池塘的数量。题目要求计算所有相连的'W'组成的池塘总数。分析与解决方案是遍历矩阵,使用DFS遍历每个'W'及其相邻的'W',将它们标记为土地,最后计算剩余的'W'数量即为池塘数。
摘要由CSDN通过智能技术生成

AcWing 1097 池塘计数

dfs搜索

题目描述

农夫约翰有一片 N∗M 的矩形土地。最近,由于降雨的原因,部分土地被水淹没了。现在用一个字符矩阵来表示他的土地。每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,则用”.”表示。现在,约翰想知道他的土地中形成了多少片池塘。每组相连的积水单元格集合可以看作是一片池塘。每个单元格视为与其上、下、左、右、左上、右上、左下、右下八个邻近单元格相连。请你输出共有多少片池塘,即矩阵中共有多少片相连的”W”块。

分析

求池塘数,也就是W连一片的数,看有几块是一整片W。如何看一片W周围是否还有其他W?
这是问题的关键。一片片的连着数,从扫到的第一个W开始一步步遍历周围的W,结束条件很难定义,并且每次扫完下次再遇见还会接着再扫,发觉颇麻烦。

思路

遍历地图中每个块,找W将其置为土地,再DFS 遍历该W周围(8个方向),一旦找到其周围存在W便将其值为 **’ . '**即土地,最终每块会只有一个W存在。这样再检查图中W点个数即可。

#include <iostream>
using namespace std;
char map[1010][1010];
int n,m;
int dx[8] = {1,0,-1,0,1,1,-1,-1}; //八个方向
int dy[8] = {0,1,0,-1,-1,1,-1,1};

void dfs(int x, int y)
{
  m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值