炒炒自己的冷饭,很久以前写的一些Leetcode题目。
题目链接:https://leetcode.com/problems/regions-cut-by-slashes
并查集
class Solution {
private:
int _fa[3600];
int N, M;
void init() {
for (int i = 0; i < M; i++)
_fa[i] = i;
}
int fa(int x) {
return x == _fa[x] ? x : _fa[x] = fa(_fa[x]);
}
void merge(int x, int y) {
x = fa(x);
y = fa(y);
_fa[x] = y;
}
public:
int regionsBySlashes(vector<string>& grid) {
// 4N^2 small triangles
N = grid.size();
M = 4*N*N;
init();
// initial merge
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
int n = 4*(i*N + j);
if (i < N - 1) {
int n1 = 4*((i+1)*N + j);
merge(n+2, n1);
}
if (j < N - 1) {
int n1 = 4*(i*N + j+1);
merge(n+1, n1+3);
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int n = 4*(i*N + j);
if (grid[i][j] != '/') {
merge(n, n+1);
merge(n+2, n+3);
}
if (grid[i][j] != '\\') {
merge(n, n+3);
merge(n+1, n+2);
}
}
}
int ans = 0;
for (int i = 0; i < M; i++) {
if (fa(i) == i)
ans++;
}
return ans;
}
};
DFS
61
class Solution {
private:
int N;
vector<int> G[3600];
void connect(int x, int y) {
G[x].push_back(y);
G[y].push_back(x);
}
bool visited[3600];
void dfs(int x) {
for (auto const& y: G[x])
if (!visited[y]) {
visited[y] = true;
dfs(y);
}
}
public:
int regionsBySlashes(vector<string>& grid) {
N = grid.size();
// initial links
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
int n = 4*(i*N + j);
if (i < N - 1) {
int n1 = 4*((i+1)*N + j);
connect(n+1, n1+3);
}
if (j < N - 1) {
int n1 = 4*(i*N + j+1);
connect(n+2, n1);
}
}
// grid picture
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int n = 4*(i*N + j);
if (grid[i][j] != '\\') {
connect(n, n+3);
connect(n+1, n+2);
}
if (grid[i][j] != '/') {
connect(n, n+1);
connect(n+2, n+3);
}
}
}
int ans = 0;
memset(visited, 0, sizeof(visited));
for (int i = 0; i < 4*N*N; i++) {
if (!visited[i]) {
visited[i] = true;
ans++;
dfs(i);
}
}
return ans;
}
};