Flood Fill算法(求连通块的数量)
算法解释:假设有一片地,该地有低坑和小高山(假设山足够高)。每当下雨的时候(假设雨水足够多),那么连通在一起的低坑会逐渐被雨水填满。而被小山围住的那些小坑就不会再往外蔓延了,那么我们可以说这样的一群连通的低坑是一个群,我们可以通过Flood Fill算法求出该地中这样的群有多少个。
由于BFS是基于迭代的算法,所以不会出现爆栈的情况,所以我们优先考虑用BFS实现Flood Flii。
模板题:
注意一点:如果输入图的时候你是从i = 1开始的话,而且还是像下面这样
for(int i = 1; i < n; i++) scanf("%s", &g[i]);
那么你一定会出错!
为什么? 因为输入图的时候,你只是规定了从第一行开始,但是列数却是从0开始的,因为字符串就是从0开始的。
所以如果非要从1开始的话,还要规定一下列也要从1开始。
贴上代码:
#include <iostream> #include <cstring> #include <queue> using namespace std; #define x first #define y second typedef pair<int,int>PII; const int N = 1010; char g[N][N]; bool st[N][N]; int n, m; void bfs(int sx, int sy) { queue<PII>q; q.push({sx, sy}); st[sx][sy] = true; while(q.size()) { auto t = q.front(); q.pop(); int x = t.x, y = t.y; for(int i = x - 1; i <= x + 1; i++) for(int j = y - 1; j <= y + 1; j++) { if(i == x && j == y) continue; if(g[i][j] == '.') continue; if(st[i][j]) continue; if(i < 0 || i >= n) continue; if(j < 0 || j >= m) continue; st[i][j] = true; q.push({i, j}); } } } int main() { scanf("%d%d", &n, &m); for(int i = 0; i < n; i++) scanf("%s", &g[i]); int cnt = 0; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) if(g[i][j] == 'W' && !st[i][j]) { bfs(i, j); cnt++; } printf("%d", cnt); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具