leetcode959. Regions Cut By Slashes

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011732358/article/details/85319906

题目链接
题目:在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。
(请注意,反斜杠字符是转义的,因此 \ 用 “\” 表示。)。返回区域的数目。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参考:
思路: 把每一小块又可以划分成如下四小小块,分别做上编号,上0下2左4右1,这样 如果该小块不是在最左边或者最上边,则它的3肯定会和左边小块的1连接在一起,2肯定会和下面小块的0连接在一起。如果在一个小块中,“\”,则把小块中的01连一起,23连一起;如果“/”,则把03连一起,12连一起。用nn代表小块的个数,count=nn*4代表小小块的个数,每当有俩小小块能连接在一起,count–,最后count极为区域总个数。
在这里插入图片描述

class Solution {
    int f[]; //f[x]保存x的上级节点
    int count;//记录有多少个区域
    int n; //记录边长
    public int regionsBySlashes(String[] grid) {
        n = grid.length;
        count = 4 * n * n;
        f = new int[4 * n * n];
        for(int i = 0; i < 4 * n * n; i++){
            f[i] = i;
        }
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                if(i > 0){
                    union(g(i - 1, j, 2), g(i, j, 0));
                }
                if(j > 0){
                    union(g(i, j - 1, 1), g(i, j, 3));
                }
                if(grid[i].charAt(j) != '/'){
                    union(g(i, j, 0), g(i, j, 1));
                    union(g(i, j, 2), g(i, j, 3));
                }
                if(grid[i].charAt(j) != '\\'){
                    union(g(i, j, 0), g(i, j, 3));
                    union(g(i, j, 2), g(i, j, 1));
                }
            }
        }
        return count;
    }
    public int find(int x){
        while(x != f[x]){
            x = f[x];
        }
        return x;
    }
    public void union(int x, int y){
        int fx = find(x);
        int fy = find(y);
        if(fx != fy){
            f[fx] = fy;
            count--;
        }
    }
    public int g(int x, int y, int k){
        return (x * n + y) * 4 + k; 
    }
}

猜你喜欢

转载自blog.csdn.net/u011732358/article/details/85319906
今日推荐