这一题又是一道关于并查集的题目,但是该如何去解决?
原来的格子是一个整的正方形,我们通过输入斜杠进行切分,我们怎么去判断斜杠切分区域和方向?我们可以把正方形改变一下,我们就假使正方形已经被我们完全切分了,变成这样:
我们把四个区域表上序号
我们对列表遍历,如果是\,连接02, 13, 如果是/连接01, 23.这个时候,我们注意要创建这个并查集时候,我们要有正方形的块数,每块分成四份,最后在判断改变。
class UnionFind:
def __init__(self, n):
self.father = {
}
self.num = 0
for x in range(n):
self.father[x] = x
self.num += 1
def find(self, x):
if x != self.father[x]:
self.father[x] = self.find(self.father[x])
return self.father[x]
return x
def merge(self, x, y):
root_x, root_y = self.find(x), self.find(y)
if root_x != root_y:
self.father[root_x] = root_y
self.num -= 1
class Solution:
def regionsBySlashes(self, grid: List[str]) -> int:
n = len(grid)
m = n*n*4#我们新建的分割好的图
uf = UnionFind(m)
def get_pos(row, col, i):
return (row*n+col)*4+i
# 这里我们需要原来的坐标进行更改,因为我们创建的新图和之前的有些不符合,我们重新找到这个点的坐标
for row in range(n):
for col in range(n):
v = grid[row][col]
if row > 0:
uf.merge(get_pos(row-1, col, 2), get_pos(row, col, 1))
if col > 0:
uf.merge(get_pos(row, col-1, 3), get_pos(row, col, 0))
if v == '/':
uf.merge(get_pos(row, col, 0), get_pos(row, col, 1))
uf.merge(get_pos(row, col, 2), get_pos(row, col, 3))
if v == '\\':
uf.merge(get_pos(row, col, 1), get_pos(row, col, 3))
uf.merge(get_pos(row, col, 0), get_pos(row, col, 2))
if v == ' ':
uf.merge(get_pos(row, col, 0), get_pos(row, col, 1))
uf.merge(get_pos(row, col, 1), get_pos(row, col, 2))
uf.merge(get_pos(row, col, 2), get_pos(row, col, 3))
return uf.num