洛谷 P1596:Lake Counting S ← Flood fill
【题目来源】
https://www.acwing.com/problem/content/1099/
https://oj.czos.cn/p/1435
【题目描述】
由于最近的降雨,水在农夫约翰的田地里积聚了。田地可以表示为一个 N×M 的矩形(1≤N≤100,1≤M≤100)。每个方格中要么是水(W),要么是干地(.)。农夫约翰想要弄清楚他的田地里形成了多少个水塘。一个水塘是由连通的水方格组成的,其中一个方格被认为与它的八个邻居相邻。给定农夫约翰田地的示意图,确定他有多少个水塘。
【输入格式】
第 1 行:两个用空格分隔的整数 N 和 M。
第 2 行到第 N+1 行:每行 M 个字符,表示农夫约翰田地的一行。
每个字符要么是 W,要么是 .。
字符之间没有空格。
【输出格式】
第 1 行:农夫约翰田地中的水塘数量。
【输入样例】
【输出样例】
3
【数据范围】
1≤N,M≤100
【算法分析】
● 泛洪算法(Flood fill)是一种针对 “连通区域” 的处理思想。核心逻辑是:从一个起始点出发,像洪水扩散一样,遍历所有 “相邻且满足相同条件” 的结点(比如同颜色、同数值),并对这些结点进行标记、修改或计数。泛洪算法(Flood fill)常用于从棋盘模型的某个点出发,然后扩展到与这个点相邻的上、下、左、右、左上、右上、左下、右下等八个点。
● 典型场景:画图软件里的「油漆桶工具」—— 点击一个红色像素,所有和它连通的红色像素都会被换成蓝色,这个过程就是 Flood fill。
● Flood Fill 是一类 “连通区域填充” 的问题场景 / 算法思想,用 BFS/DFS 都可以实现。但 BFS 是实现 Flood Fill 最常用的核心算法之一。 原因在于,BFS “无栈溢出风险 + 天然支持层级 / 距离计算”,适配 Flood fill 的大多数实际场景。DFS 仅在小网格、无层级需求时更简洁,但稳定性不如 BFS。
【算法代码一:dfs】
【算法代码二:bfs+pair】
【算法代码三:bfs+结构体】
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/158655296
https://www.acwing.com/solution/content/130658/
https://blog.csdn.net/qq_52156445/article/details/117133513
https://blog.csdn.net/Jay_fearless/article/details/107947462

浙公网安备 33010602011771号