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