并查集
2026-05-04 13:41:43
发布于:浙江
2阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
char mp[N][N];
int n, m;
// 并查集
int fa[N*N], sz[N*N];
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};
// 找根
int find(int x) {
if(fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
}
// 合并
void unite(int x, int y) {
x = find(x);
y = find(y);
if(x == y) return;
if(sz[x] < sz[y]) swap(x,y);
fa[y] = x;
sz[x] += sz[y];
}
// 给(i,j)算编号
int getid(int i, int j) {
return (i-1)*m + (j-1);
}
int main() {
cin >> n >> m;
int sx, sy;
// 初始化并查集
int tot = n * m;
for(int i = 0; i < tot; i++) {
fa[i] = i;
sz[i] = 1;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> mp[i][j];
if(mp[i][j] == '@') {
sx = i;
sy = j;
}
}
}
// 遍历每个格子,向右、向下合并相邻可走格子
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
// 红色墙跳过
if(mp[i][j] == '#') continue;
// 只看右、下两个方向,避免重复合并
for(int d = 0; d < 2; d++) {
int ni = i + dx[d];
int nj = j + dy[d];
if(ni < 1 || ni > n || nj < 1 || nj > m) continue;
if(mp[ni][nj] == '#') continue;
unite(getid(i,j), getid(ni,nj));
}
}
}
// 起点所在集合大小就是答案
int st = getid(sx, sy);
cout << sz[find(st)] << endl;
return 0;
}
这里空空如也







有帮助,赞一个