这道题就统计有多少个连通块就行了
这时候我们又需要把二维转成一维了,也就是把每一个格子都给一个编号
当我们合并连通块的时候,其实是只需要四个方向的
因为我们是从上往下遍历的,我们遍历到某个位置的时候,它已经和上面部分合并完了,我们只需要考虑右边和下边就行了
就像如图
最后我们的答案就是有多少个连通块,也就是多少个是W并且fa[i]=i
#include <iostream> using namespace std; int n, m; const int N = 110; char a[N][N]; int fa[N * N]; int dx[] = { 0,1,1,1 }; int dy[] = { 1,0,-1,1 }; int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]); } void un(int x, int y) {int px = find(x);int py = find(y);fa[px] = py; } int main() {cin >> n >> m;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> a[i][j];}}for (int i = 0; i < n * m; i++){fa[i] = i;}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (a[i][j] == 'W'){for (int k = 0; k < 4; k++){int p = i * m + j;int x = i + dx[k], y = j + dy[k];if (x<0 || y<0 || x>=n || y>=m || a[x][y]=='.') continue;int cur = x * m + y;un(p, cur);}}}}int cnt = 0;for (int i = 0; i < n * m; i++){int x = i / m, y = i % m;if (a[x][y] == '.') continue;if (fa[i] == i) cnt++;}cout << cnt << endl;return 0; }