通过队列


 BFS版本

#include <iostream>
#include <set>
#include <vector>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <queue>
#define ll long long
const int M = 1e3 + 1;
using namespace std;
int a[M][M];
int n, m;
int x1[M] = { 0,0,-1,1,0 };
int yt[M] = { 0,1,0,0,-1 };
queue<int> v, u;
inline void dfs(int x, int y) {
    int dx, dy;
    a[x][y] = 0;
    for (int i = 1; i <= 4; i++) {
        dx = x1[i] + x;
        dy = yt[i] + y;
        if (dx >= 1 && dx <= n && dy >= 1 && dy <= m && a[dx][dy] != 0) {
            dfs(dx, dy);
        }
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            scanf("%1d",&a[i][j]) //注意这里是输入一个数字,要限定一个数字,不然会出错的
        }
        
    }
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (a[i][j] != 0) {
                v.push(i), u.push(j);
                while (!v.empty())
                {
                    dfs(v.front(), u.front());
                    v.pop(), u.pop();
                }
                ans++;
            }
        }
    }
    cout << ans << endl;
}

 

DFS
#include<cstdio>
using namespace std;
char a[101][101];
int ans;
int n,m;
void dfs(int x,int y){
    a[x][y]='.';
    int dx,dy;
    for(int i=-1;i<=1;i++){
        for(int j=-1;j<=1;j++){
            dx=x+i;
            dy=y+j;
            if(dx>=0&&dx<=n&&dy>=0&&dy<m&&a[dx][dy]=='W'){
                dfs(dx,dy);
            }
        }
    }
    return;
} 
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++){
        scanf("%s",a[i]);//避免换行带来问题这里直接读入字符串
    }
    for(int i=0;i<=n;i++){
        for(int j=0;j<m;j++){
            if(a[i][j]=='W'){//如果是W的话就直接开始遍历
                dfs(i,j);
                ans++;//水潭加一处
            }
        }
    }
    printf("%d",ans);
    return 0;
}