题目内容
在由 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导致一直找不到错误,和关键字同名了,真是气不打一处出.以后一定要注意细节.