题目地址:
https://leetcode.com/problems/regions-cut-by-slashes/description/
给定一个 n × n n\times n n×n的网格,给出一个字符串数组 A A A, A [ i ] [ j ] A[i][j] A[i][j]表示 ( i , j ) (i,j) (i,j)这个格子里的划线,划线有两种,一种是从左上到右下;另一种是从右上到左下;当然也可以没有划线。问这个网格被分成了多少个连通块。
参考https://blog.csdn.net/qq_46105170/article/details/119140758。代码如下:
class Solution {
public:
int n, res;
vector<int> p;
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void merge(int x, int y) {
int px = find(x), py = find(y);
if (px != py) {
p[px] = py;
res--;
}
}
int regionsBySlashes(vector<string>& g) {
int n = g.size();
res = 4 * n * n;
p.resize(res);
for (int i = 0; i < res; i++) p[i] = i;
auto get = [&](int i, int j) { return (i * n + j) * 4; };
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
int a[4] = {get(i, j)};
for (int k = 1; k < 4; k++) a[k] = a[0] + k;
char ch = g[i][j];
if (ch == ' ')
for (int k = 1; k < 4; k++) merge(a[0], a[k]);
else if (ch == '/')
merge(a[0], a[1]), merge(a[2], a[3]);
else if (ch == '\\')
merge(a[1], a[2]), merge(a[0], a[3]);
if (j < n - 1) merge(a[2], a[2] + 2);
if (i < n - 1) merge(a[3], get(i + 1, j) + 1);
}
return res;
}
};
时空复杂度 O ( n 2 log ∗ n 2 ) O(n^2\log^*n^2) O(n2log∗n2),空间 O ( n 2 ) O(n^2) O(n2)。