并查集 - 由斜杠划分区域

题目链接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

求划分区域的个数,也就是求连通分量的个数,将每个单元格划分为4个部分,分别根据空格、斜杠、反斜杠进行合并。

在这里插入图片描述
单元格之间也要合并,上下、左右各选一个方向即可。
在这里插入图片描述

class UnionFind{

public:
    UnionFind(int n): count(n), parent(n), size(n, 1) {
        iota(parent.begin(), parent.end(), 0);
    }

    int find(int x) {
        return x == parent[x] ? x : find(parent[x]);
    }

    bool unite(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) {
            return false;
        }
        if (size[x] < size[y]) {
            swap(x, y);
        }
        parent[y] = x;
        size[x] += size[y];
        --count; 
        return true;
    }

public:
    int count;
    vector<int> parent;
    vector<int> size;
};

class Solution {
public:
    int regionsBySlashes(vector<string>& grid) {
        int n = grid.size();
        UnionFind uf(4 * n * n);
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                int idx = (i * n + j) * 4;
                if (grid[i][j] == ' ') { // 0 1 2 3
                    uf.unite(idx, idx+1);
                    uf.unite(idx+1, idx+2);
                    uf.unite(idx+2, idx+3);
                }else if (grid[i][j] == '/') { // 1 2 ; 0 3
                    uf.unite(idx, idx+3);
                    uf.unite(idx+1, idx+2);
                }else { // 0 1 ; 2 3
                    uf.unite(idx, idx+1);
                    uf.unite(idx+2, idx+3);
                }
                if (j + 1 < n) {
                    uf.unite(idx+1, idx+7);
                }
                if (i + 1 < n) {
                    uf.unite(idx+2, idx+n*4);
                }
            }
        }
        return uf.count;
    }
};
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页