在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。
(请注意,反斜杠字符是转义的,因此 \ 用 “\” 表示。)。
返回区域的数目。
解法:
分为三种情况:
为 ‘/’ 时,需要连接小方格中的0、3和1、2
除此之外,还需要对相邻的小方格进行连接,为了减少运算量,这里选择对右边和下边的小方格进行连接。(需要判断下方或右方是否还有小方格)
因为不管是哪种,小方格的1号三角形都会与右边的3号三角形连接,2号三角形都会与下方的0号三角形连接,因此每个小方格都要与隔壁的进行连接。
然后遍历数组,对每一个小方格进行相应的连接,然后判断是否有右边/下边的小方格并进行连接即可。
tip: 因为有左右/上下方格的连接,所以小方格在自身连接时,就已经自然与其他方格建立了连接。
class UnionFindSet():
def __init__(self):
self.setSize = 0 #不连通区域
self.father = {
}
def add(self,x): #添加根节点
if x not in self.father:
self.father[x] = -1
self.setSize += 1
def find(self,x):
root = x
while self.father[root] != -1: #找根节点
root = self.father[root]
while (x != root): #路径压缩
o = self.father[x] #找x的父节点
self.father[x] = root #把x的父节点设置成刚才找到的根
x = o #往上一层
return root
def merge(self,x, y):
root_x = self.find(x)
root_y = self.find(y)
if root_x != root_y:
self.father[root_x] = root_y #合并
self.setSize -= 1
class Solution:
def regionsBySlashes(self, grid: List[str]) -> int:
uf = UnionFindSet()
lenth = len(grid)
for row in range(lenth):
for col in range(lenth):
char = grid[row][col]
if char == ' ':
uf.add((row, col, 0))
uf.add((row, col, 1))
uf.add((row, col, 2))
uf.add((row, col, 3))
uf.merge((row, col, 0),(row, col, 1))
uf.merge((row, col, 0),(row, col, 2))
uf.merge((row, col, 0),(row, col, 3))
elif char == '\\':
uf.add((row, col, 0))
uf.add((row, col, 1))
uf.add((row, col, 2))
uf.add((row, col, 3))
uf.merge((row, col, 0),(row, col, 1))
uf.merge((row, col, 2),(row, col, 3))
elif char == '/':
uf.add((row, col, 0))
uf.add((row, col, 1))
uf.add((row, col, 2))
uf.add((row, col, 3))
uf.merge((row, col, 0),(row, col, 3))
uf.merge((row, col, 1),(row, col, 2))
if row < lenth: #连接下面的块
uf.add((row + 1, col, 0))
uf.merge((row, col, 2),(row + 1, col, 0))
if col < lenth: #连接右面的块
uf.add((row, col + 1, 3))
uf.merge((row, col, 1),(row, col + 1, 3))
return uf.setSize