1. 程式人生 > 其它 >每日一題——959. 由斜槓劃分區域

每日一題——959. 由斜槓劃分區域

技術標籤:LeetCodeleetcode圖論

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