【LittleXi】959. 由斜杠划分区域

【LittleXi】959. 由斜杠划分区域

题目链接

前情提要

这个题感觉是非常经典的在矩阵上应用并查集寻找连通块的题、

核心思路

将每个块拆分为6个,然后进行连接

解题思路

将每个正方形分为6份(不分为4份的原因是每个小块的index太难算了,尽管6份的情况下index也很难算)
然后根据grid[i][j]的情况分类讨论进行连接
最后统计连通分量的数量就好啦

AC代码

class Solution {
public:
    int fa[100005];
    void init(int n)
    {
        fa[n] = n;
    }
    int find(int i)
    {
        if (fa[i] == i)
            return i;
        fa[i] = find(fa[i]);
        return fa[i];
    }
    void unionn(int x, int y)
    {
        int fa1 = find(x);
        int fa2 = find(y);
        fa[fa1] = fa2;
    }
    int regionsBySlashes(vector<string>& grid) {
        int n = grid.size();
        int mm = 3 * n;
        int nn = 2 * n;
        for (int i = 0; i < 10000; i++)
        {
            init(i);
        }
        //并查集连点
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                vector<int> id = { 6 * n * i + 2 * j,6 * n * i + 2 * j + 1,
6 * n * i + 2*n + 2 * j,6 * n * i + 2*n + 2 * j + 1,
6 * n * i + 4 * n + 2 * j,6 * n * i + 4 * n + 2 * j + 1 };
                if (grid[i][j] == ' ')
                {
                    for (int i = 0; i < 5; i++)
                    {
                        unionn(id[i], id[i + 1]);
                    }
                }
                if (grid[i][j] == '/')
                {
                    unionn(id[0], id[1]);
                    unionn(id[0], id[2]);
                    unionn(id[3], id[5]);
                    unionn(id[4], id[5]);

                }
                if (grid[i][j] == '\\')
                {

                    unionn(id[0], id[1]);
                    unionn(id[1], id[3]);
                    unionn(id[2], id[4]);
                    unionn(id[4], id[5]);
                }
                if (j < n - 1 )
                    unionn(id[3], 6 * n * i + 2*n + 2 * j + 2);      
                if (i < n - 1)
                    unionn(id[5], 6 * n * i + 6 * n + 2 * j + 1);
            }
        }
        unordered_set<int> use;
        for (int i = 0; i < 6 * n * n; i++)
        {
            use.insert(find(i));
        }
        return use.size();
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值