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;
}
复制代码

 

posted @   飘向远方丶  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示