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

题目内容

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

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

返回区域的数目。

示例 1:

输入:
[
" /",
"/ "
]
输出:2
解释:2x2 网格如下:
在这里插入图片描述

示例 2:

输入:
[
" /",
" "
]
输出:1
解释:2x2 网格如下:
在这里插入图片描述

示例 3:

输入:
[
“\/”,
“/\”
]
输出:4
解释:(回想一下,因为 \ 字符是转义的,所以 “\/” 表示 /,而 “/\” 表示 /\。)
2x2 网格如下:
在这里插入图片描述

示例 4:

输入:
[
“/\”,
“\/”
]
输出:5
解释:(回想一下,因为 \ 字符是转义的,所以 “/\” 表示 /\,而 “\/” 表示 /。)
2x2 网格如下:
在这里插入图片描述

示例 5:

输入:
[
“//”,
"/ "
]
输出:3
解释:2x2 网格如下:
在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/regions-cut-by-slashes

c语言解答(参考了官方解答)

void initialise(int n,int parent[]){
    for(int i=0;i<n*n*4;i++){
        parent[i]=i;
    }
}
int find_root(int x,int parent[]){
    int x_root=x;
    while(parent[x_root]!=x_root){
        x_root=parent[x_root];
    }
    return x_root;
}

int regionsBySlashes(char ** grid, int gridSize){
    //代表边数
    int n=gridSize;
    int parent[4*n*n];
    initialise(n,parent);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int index=4*(i*n+j);
            //方格内合并
            if(grid[i][j]=='/'){
                union_a(index,index+3,parent);
                union_a(index+1,index+2,parent);
            }
            else if(grid[i][j]=='\\'){
                union_a(index,index+1,parent);
                union_a(index+3,index+2,parent);
            }
            else{
                union_a(index,index+1,parent);
                union_a(index,index+2,parent);
                union_a(index,index+3,parent);
            }
            // 方格间合并
            if (j + 1 < n) {
                union_a(index + 1, 4 * (i * n + j + 1) + 3,parent);
            }
            if (i + 1 < n) {
                union_a(index + 2, 4 * ((i + 1) * n + j),parent);
            }
        }
    }
    //统计不同区域数量
    int count=0;
    for(int i=0;i<4*n*n;i++){
        if(find_root(i,parent)==i){
            count++;
        }
    }
    return count;
}
void union_a(int x, int y,int parent[]){
    int x_root=find_root(x,parent);
    int y_root=find_root(y,parent);
    if(x_root!=y_root){
        parent[x_root]=y_root;
    }
    return ;
}

总结

改错时候一定要注意=和==区别,这个最让人头疼,更头疼的是这次竟然把联合节点写成union导致一直找不到错误,和关键字同名了,真是气不打一处出.以后一定要注意细节.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值