classSolution { public: int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0};
voiddfs(int x, int y, vector<vector<int>>& grid){ int n = grid.size(); for (int i = 0; i < 4; ++i) { int nx = x + dx[i], ny = y + dy[i]; if (0 <= nx && nx < n && 0 <= ny && ny < n && !grid[nx][ny]) { grid[nx][ny] = 1; dfs(nx, ny, grid); } } }
intregionsBySlashes(vector<string>& grid){ int n = grid.size(); vector<vector<int>> new_grid(3*n, vector<int>(3*n, 0)); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == '/') { new_grid[3*i][3*j+2] = 1; new_grid[3*i+1][3*j+1] = 1; new_grid[3*i+2][3*j] = 1; } elseif (grid[i][j] == '\\') { new_grid[3*i][3*j] = 1; new_grid[3*i+1][3*j+1] = 1; new_grid[3*i+2][3*j+2] = 1; } } } int cnt = 0; for (int i = 0; i < 3*n; ++i) { for (int j = 0; j < 3*n; ++j) { if (!new_grid[i][j]) { cnt++; new_grid[i][j] = 1; dfs(i, j, new_grid); } } } return cnt; } };
方法 2(c++)
classSolution { public: vector<int> f;
intfind(int x){ return x==f[x] ? x : f[x]=find(f[x]); }
voidmerge(int u, int v){ int fu = find(u), fv = find(v); if (fu == fv) return; f[fv] = fu; }
intregionsBySlashes(vector<string>& grid){ int n = grid.size(); f = vector<int>(4*n*n, 0); for (int i = 0; i < 4*n*n; ++i) { f[i] = i; } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { int s = 4*(i*n+j); if (grid[i][j] == '/') { merge(s, s+3); merge(s+1, s+2); } else { merge(s, s+1); merge(s+2, s+3); } if (grid[i][j] == ' ') { merge(s, s+3); } if (i > 0) merge(s, s-4*n+2); if (i < n-1) merge(s+2, s+4*n); if (j > 0) merge(s+3, s-3); if (j < n-1) merge(s+1, s+7); } } int cnt = 0; for (int i = 0; i < 4*n*n; ++i) { if (find(i) == i) cnt++; } return cnt; } };
方法 3(c++)
classSolution { public: vector<int> f;
intfind(int x){ return x==f[x] ? x : f[x]=find(f[x]); }
intmerge(int u, int v){ int fu = find(u), fv = find(v); if (fu == fv) return0; f[fv] = fu; return1; }
intregionsBySlashes(vector<string>& grid){ int n = grid.size(); f = vector<int>((n+1)*(n+1), 0); for (int i = 0; i < (n+1)*(n+1); ++i) { f[i] = i; } for (int i = 0; i < n; ++i) { merge(i, i+1); merge(n*(n+1)+i, n*(n+1)+i+1); merge(i*(n+1), (i+1)*(n+1)); merge(i*(n+1)+n, (i+1)*(n+1)+n); } int cnt = 1; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == ' ') continue; int u, v; if (grid[i][j] == '/') { u = i*(n+1)+j+1; v = (i+1)*(n+1)+j; } else { u = i*(n+1)+j; v = (i+1)*(n+1)+j+1; } if (!merge(u, v)) cnt++; } } return cnt; } };