题目
https://leetcode-cn.com/problems/regions-cut-by-slashes/
并查集
这题的关键点就是如何将每个方格进行划分,以及如何计算每个小方格的坐标,然后根据每个方格的类型在方格内合并,然后再方格之间合并,最后返回连通分量的个数即可
class Solution {
public int regionsBySlashes(String[] grid) {
int N = grid.length;
int size = 4 * N * N;
UnionFind uf = new UnionFind(size);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int idx = 4 * (i * N + j); // 标号为0的小三角形的坐标
char cur = grid[i].charAt(j);
if (cur == '\\') {
uf.union(idx, idx + 1);
uf.union(idx + 2, idx + 3);
} else if (cur == '/') {
uf.union(idx, idx + 3);
uf.union(idx + 1, idx + 2);
} else {
uf.union(idx, idx + 1);
uf.union(idx + 1, idx + 2);
uf.union(idx + 2, idx + 3);
}
if (j + 1 < N) {
uf.union(idx + 1, 4 * (i * N + j + 1) + 3);
}
if (i + 1 < N) {
uf.union(idx + 2, 4 * ((i + 1) * N + j));
}
}
}
return uf.getCount();
}
class UnionFind {
private int[] parent;
private int count;
public UnionFind(int size) {
parent = new int[size];
count = size;
for (int i = 0; i < size; i++) {
parent[i] = i;
}
}
public int find(int x) {
while (x != parent[x]) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
public void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY)
return;
parent[rootX] = rootY;
count--;
}
public int getCount() {
return count;
}
}
}