每日一題——959. 由斜槓劃分區域
阿新 • • 發佈:2021-01-26
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