68 lines
1.2 KiB
C
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;
|
|
} |