在由 1 x 1 方格组成的 n x n 网格 grid 中,每个 1 x 1 方块由 '/'、'\' 或空格构成。这些字符会将方块划分为一些共边的区域。
给定网格 grid 表示为一个字符串数组,返回 区域的数量 。
请注意,反斜杠字符是转义的,因此 '\' 用 '\\' 表示。
示例 1:

输入:grid = [" /","/ "]
输出:2
示例 2:

输入:grid = [" /"," "]
输出:1
示例 3:

输入:grid = ["/\\","\\/"]
输出:5
解释:回想一下,因为 \ 字符是转义的,所以 "/\\" 表示 /\,而 "\\/" 表示 \/。
/* ________
* |\ 1 / |
* | \/ |
* | 0/\ 2|
* | / 3 \|
* --------
* 按如上划分每个 1x1 的方格为四个部分,并分配序号
class Solution {
public int regionsBySlashes(String[] grid) {
int len = grid.length;
int size = len * len * 4;
UnionfindLinkNode u = new UnionfindLinkNode(size);
int start = 0;
for (int i = 0; i < grid.length; i++) {
String line = grid[i];
for (int j = 0; j < line.length(); j++) {
int left = start++;
int up = start++;
int right = start++;
int down = start++;
//不是最左边
if (j != 0) {
//合入左边
u.union(left, left - 2);
}
//不是第一层
if (i != 0) {
//合入上边
u.union(up, up - ((len - 1) * 4 + 2));
}
char cur = line.charAt(j);
if (cur == '/') {
u.union(left, up);
u.union(right, down);
} else if (cur == '\\') {
u.union(right, up);
u.union(left, down);
} else {
u.union(left, up);
u.union(up, right);
u.union(right, down);
}
}
}
return u.size();
}
}
//链表实现的并查集
class UnionfindLinkNode {
private Node[] nodes;
private int size;
private int num;
public UnionfindLinkNode(int num) {
nodes = new Node[num];
for (int i = 0; i < num; i++) {
nodes[i] = new Node();
}
this.size = num;
this.num = num;
}
public void union(int x, int y) {
if (x < 0 || y < 0 || x > this.num - 1 || y > this.num - 1) {
return;
}
Node nodeX = nodes[x];
Node nodeY = nodes[y];
//代表节点
Node firstX = nodeX.first;
Node firstY = nodeY.first;
if (firstX == firstY) {
return;
}
//尾节点
Node tailX = firstX.pre;
Node tailY = firstY.pre;
tailX.next = firstY;
firstY.pre = tailX;
tailY.next = firstX;
firstX.pre = tailY;
//更新y链表的代表节点
Node start = firstY;
while (start != tailY) {
start.first = firstX;
start = start.next;
}
tailY.first = firstX;
size--;
System.out.println(x + ":" + y + ":" + size);
}
public boolean isSameSet(int x, int y) {
return nodes[x].first == nodes[y].first;
}
public int size() {
return size;
}
}
class Node {
//上一个节点
Node pre = this;
//下一个节点
Node next = this;
//代表节点
Node first = this;
}
这个博客讨论了一种使用并查集(Union Find)数据结构来解决由1x1方格组成的网格中区域数量的问题。在给定包含'/'、''和空格的网格字符串数组中,算法通过遍历每个方格并根据斜线方向连接相邻区域,最终计算出区域总数。示例展示了不同输入网格下的区域计数,包括特殊情况的处理。
5194

被折叠的 条评论
为什么被折叠?



