版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
}