在由 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 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();
}
}