leetcode 959. 由斜杠划分区域(并查集)

在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。

(请注意,反斜杠字符是转义的,因此 \ 用 “\” 表示。)。

返回区域的数目。

示例 1:

输入:
[
" /",
"/ "
]
输出:2

代码

class Solution {
    int[] fa;
    public void  init()
    {
        for(int i=0;i<fa.length;i++)
            fa[i]=i;

    }
    public int  find(int x)
    {
        if(x!=fa[x])
          fa[x]=find(fa[x]);
        return fa[x];
    }
    public void   union(int x,int y)
    {
        x=find(x);
        y=find(y);
        if(x==y) return;
        fa[x]=y;

    }
    public int regionsBySlashes(String[] grid) {

        int n=grid.length;
        fa=new int[n*n*4];//将每个节点分成4份
//     \ 0/
       3 | 1
//     / 2\ 
        init();
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            {
                int cur=i*n+j;//当前节点
                if(i<n-1)//与左边节点的3号相邻
                {
                    union(cur*4+2,(n*(i+1)+j)*4);
                }
                if(j<n-1)//与下边节点的0号相邻
                    union(cur*4+1,(i*n+j+1)*4+3);
                if(grid[i].charAt(j)=='\\') \\分成 0 12 3
                {
                    union(cur*4,cur*4+1);
                    union(cur*4+2,cur*4+3);
                }else if(grid[i].charAt(j)=='/')\\分成 0 32 1
                {
                    union(cur*4,cur*4+3);
                    union(cur*4+2,cur*4+1);
                }else {//分成 0 1 2 3

                    union(cur * 4, cur * 4 + 3);
                    union(cur * 4 + 2, cur * 4 + 1);
                    union(cur * 4 + 2, cur * 4 + 3);
                }
            }
        Set<Integer> set=new HashSet<>();//计算连通分量的个数
            for(int i=0;i<n*n*4;i++)
            {
                set.add(find(i));
            }
            return set.size();


    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值