毎日1題はスラッシュで区域LeetCode 959を区分する
問題を調べ、各セルを4つの小さな三角形と見なし、各小さな三角形をマージします.
// ,
class UnionFind {
public:
UnionFind(int n): f(n), count(n) {
for (int i = 0; i < n; ++i) {
f[i] = i;
}
}
int findf(int x) {
if (f[x] != x) {
f[x] = findf(f[x]);
}
return f[x];
}
void unionMerge(int x, int y) {
int fx = findf(x), fy = findf(y);
if (fx == fy) return;
f[fy] = fx;
count--;
}
int getCount() {
return count;
}
private:
vector<int> f;
int count;
};
class Solution {
public:
int regionsBySlashes(vector<string>& grid) {
int gridNums = grid.size();
int traingleSize = 4 * gridNums * gridNums;
UnionFind uf(traingleSize);
for (int i = 0; i < gridNums; ++i) {
for (int j = 0; j < gridNums; ++j) {
int index = 4 * (i * gridNums + j);
char c = grid[i][j];
//
if (c == ' ') {
// ,0123
uf.unionMerge(index, index + 1);
uf.unionMerge(index, index + 2);
uf.unionMerge(index, index + 3);
}
else if (c == '/') {
// , 01 23
uf.unionMerge(index, index + 1);
uf.unionMerge(index + 2, index + 3);
}
else if (c == '\\') {
// , 12 03
uf.unionMerge(index + 1, index + 2);
uf.unionMerge(index, index + 3);
}
// , , 2 0 , 3 1
if (j < gridNums - 1) {
//
uf.unionMerge(index + 2, 4 * (i * gridNums + j + 1));
}
if (i < gridNums - 1) {
//
uf.unionMerge(index + 3, 4 * ((i + 1) * gridNums + j) + 1);
}
}
}
return uf.getCount();
}
};