2026-01-12 22:09:26 +09:00

68 lines
1.2 KiB
C

#include <stdio.h>
char field[1001][1001];
int N, M;
int parent[1000000];
int rank[1000000];
int find(int x) {
if(x != parent[x]) return parent[x] = find(parent[x]);
return x;
}
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void Union(int x, int y) {
x = find(x);
y = find(y);
if(rank[x] < rank[y]) swap(&x, &y);
parent[y] = x;
if(rank[x] == rank[y]) rank[x]++;
}
int area_num(int i, int j) {
return M*i + j;
}
int main() {
scanf("%d %d",&N, &M);
for(int i=0; i<N; i++) {
scanf("%s",field[i]);
for(int j=0; j<M; j++) {
int area = area_num(i, j);
parent[area] = area;
}
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
char arrow = field[i][j];
int now = area_num(i, j);
int next;
if(arrow == 'D') next = area_num(i+1, j);
else if(arrow == 'U') next = area_num(i-1,j);
else if(arrow == 'L') next = area_num(i,j-1);
else next = area_num(i,j+1);
Union(now, next);
}
}
int ans = 0;
for(int i=0; i<M*N; i++) {
if(i == parent[i]) ans++;
}
printf("%d\n",ans);
return 0;
}