池塘计数floodfill

Flood Fill算法是一种用于查找连通区域的算法。它从一个起点开始,通过检查相邻格子逐步扩展,直到无法扩展为止。在过程中需要注意避免重复访问同一格子。该算法可以用宽度优先搜索或深度优先搜索实现,但深搜可能导致栈溢出。关键在于设定进入算法的条件,将起点加入队列并标记,然后在队列非空时不断扩展并判断新点的有效性,如是否越界、已被覆盖或为障碍物。扩展的点同样会被加入队列并标记,然后选择队列中的点继续扩展。
摘要由CSDN通过智能技术生成

Flood fill算法:从一个起点开始,然后每一次随机选一个新加入的格子看周围能不能扩展新的格子,如果能的话就把他扩展进来,直到不能扩展新的格子为止。
需要判重,同样一个格子只能覆盖一次
可以在线性时间复杂度内,找到某个点所在的连通块(找连通块)
宽搜和深搜都可以实现,深搜可能发生爆栈

总结:
先找到进入floodfill的条件
然后加入把起点加入队列并进行标记
只要队列不空就对格子进行扩展(要除去自己因为自己已经被覆盖过了)
然后判定是否有效(是否超出范围,是否已经覆盖或者是石头)
把扩展的点加入队列并进行标记
然后从已经加入的队列里的数随机选一个再次进行扩展

#include<iostream>
#include<string>
#include<algorithm>
#define x first
#define y second
using namespace std;
const int N=1010,M=N*N;
typedef pair<int,int>PII;//要存坐标
char g[N][N];
PII q[M];//队列
bool st[N][N];//宽搜基本要判重
int n,m,cnt;
void bfs(int sx,int sy)
{
    int hh=0,tt=0;//模拟队列
    q[0]={sx,sy};
    st[sx][sy]=true;//已经覆盖了并且保证时间复杂度是线性
    while(hh<=tt)
    {
        PII t=q[hh++];
        for(int i=t.x-1;i<=t.x+1;i++)//遍历格子的周围
         for(int j=t.y-1;j<=t.y+1;j++)
         {
             if(i==t.x&&j==t.y) continue;//把中间的挖掉
             if(i<0||i>=n||j<0||j>=m) continue;//越界不行
             if(g[i][j]=='.'||st[i][j]) continue;//是石头不行或者说已经覆盖
             
             q[++tt]={i,j};
             st[i][j]=true;
         }
    }
    
}
int main()
{
    
    cin>>n>>m;
    for(int i=0;i<n;i++) cin>>g[i];
    for(int i=0;i<n;i++)
     for(int j=0;j<m;j++)
       if(g[i][j]=='W'&&!st[i][j])//进入floodfill的条件
        {
            bfs(i,j);
            cnt++;
        }
        
        cout<<cnt;
     
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值