51 lines
1.3 KiB
TypeScript
51 lines
1.3 KiB
TypeScript
export {};
|
|
const input = require("fs").readFileSync(0).toString().trim().split('\n');
|
|
const [N, M]: number[] = input[0].split(" ").map(Number);
|
|
let field: string[] = [];
|
|
for(let i=1; i<=N; i++) field.push(input[i]);
|
|
|
|
let parents: number[] = Array.from({length: N*M}, (_, i) => i);
|
|
let rank: number[] = new Array(N*M).fill(0);
|
|
const areaNum = (col: number, row: number): number => { return M*row + col; }
|
|
|
|
const find = (x: number): number => {
|
|
if(x !== parents[x]) return parents[x] = find(parents[x]);
|
|
return parents[x];
|
|
}
|
|
|
|
const union = (x: number, y: number) => {
|
|
x = find(x);
|
|
y = find(y);
|
|
|
|
if(x===y) return;
|
|
|
|
if(rank[x] < rank[y]) {
|
|
const temp = x;
|
|
x = y;
|
|
y = temp;
|
|
}
|
|
|
|
parents[y] = x;
|
|
|
|
if(rank[x] === rank[y]) rank[x]++;
|
|
}
|
|
|
|
for(let x=0; x<M; x++) {
|
|
for(let y=0; y<N; y++) {
|
|
const arrow: string = field[y][x];
|
|
const curArea: number = areaNum(x,y);
|
|
let nxtArea: number = 0;
|
|
|
|
if(arrow === 'D') nxtArea = areaNum(x,y+1);
|
|
else if(arrow === 'U') nxtArea = areaNum(x, y-1);
|
|
else if(arrow === 'L') nxtArea = areaNum(x-1, y);
|
|
else nxtArea = areaNum(x+1, y);
|
|
|
|
union(curArea, nxtArea);
|
|
}
|
|
}
|
|
|
|
let ans: number = 0;
|
|
parents.forEach((v,i) => { if(v===i) ans += 1 });
|
|
console.log(ans);
|