959. 由斜杠划分区域
分类:图论、并查集
完全没想到…
每一个单元格可能被、
/
、\
划分。为了使划分结果一致,将一个单元格看做沿对角线拼成的四个等腰直角三角形,顺时针标号0 1 2 3
单元格内:如果是,连接0123;如果是
/
,连接23 12;如果是…
单元格间:每个单元格与自己的右方和下方连接
class UnionFind{
private:
vector<int> u;
vector<int> sz;
public:
int member;
UnionFind(int n):member(n), u(n), sz(n, 1){
iota(u.begin(), u.end(), 0);
}
int root(int i){
return u[i] == i? i : u[i] = root(u[i]);
}
bool connect(int i, int j){
int ri = root(i), rj = root(j);
if(ri == rj){
return false;
}
if(sz[ri] < sz[rj]){
swap(ri, rj);
}
u[rj] = ri;
sz[ri] += sz[rj];
member--;
return true;
}
};
class Solution {
public:
int regionsBySlashes(vector<string>& grid) {
if(grid.size() == 0) return 0;
int n = grid.size();
UnionFind u(4*n*n);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
//单元格内
if(grid[i][j] == ' '){
u.connect((i*n+j)*4, (i*n+j)*4+1);
u.connect((i*n+j)*4, (i*n+j)*4+3);
u.connect((i*n+j)*4 ,(i*n+j)*4+2);
}else if(grid[i][j] == '/'){
u.connect((i*n+j)*4, (i*n+j)*4+3);
u.connect((i*n+j)*4+1, (i*n+j)*4+2);
}else if(grid[i][j] == '\\'){
u.connect((i*n+j)*4, (i*n+j)*4+1);
u.connect((i*n+j)*4+2, (i*n+j)*4+3);
}
//单元格间:右、下
if(j+1 < n) u.connect((i*n+j)*4+1, (i*n+j+1)*4+3);
if(i+1 < n) u.connect((i*n+j)*4+2, (i*n+j+n)*4);
}
}
return u.member;
}
};/* 89.9% **/
2021/01/25