1249:Lake Counting

题目分析:

1.八连通积水是连通在一起,叫水洼
2. 求水洼个数:转换为求W连通块个数

代码如下:

#include<iostream>
#include<queue>

using namespace std;

#define x first
#define y second
#define pii pair<int,int>

const int N = 115;

int n,m;
char g[N][N];
bool st[N][N];

void bfs(int sx,int sy){
    queue<pii> q;
    q.push({sx,sy});
    st[sx][sy] = true;
    while(q.size()){
        pii t = q.front();
        q.pop();

        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 - 1 || j < 0 || j > m - 1) continue;
                    if(st[i][j] || g[i][j] != 'W') continue;
                    q.push({i,j});
                    st[i][j] = true;
                }
    }    
}

int main(){
    cin >> n >> m;
    for(int i = 0; i < n; i ++ ) cin >> g[i];
    int cnt = 0;
    for(int i = 0; i < n; i ++ )
        for(int j = 0; j < m; j ++ )
            if(!st[i][j] && g[i][j] == 'W') bfs(i,j),cnt ++;    
    cout<<cnt;
    return 0;
}