在由 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 1 和 2 3{union(cur*4,cur*4+1);union(cur*4+2,cur*4+3);}else if(grid[i].charAt(j)=='/')\\分成 0 3 和 2 1{union(cur*4,cur*4+3);union(cur*4+2,cur*4+1);}else {//分成 0 1 2 3union(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();}
}