力扣959.用斜杠划分区域——python解决

这一题又是一道关于并查集的题目,但是该如何去解决?
原来的格子是一个整的正方形,我们通过输入斜杠进行切分,我们怎么去判断斜杠切分区域和方向?我们可以把正方形改变一下,我们就假使正方形已经被我们完全切分了,变成这样:
力扣959.用斜杠划分区域——python解决_第1张图片
我们把四个区域表上序号
力扣959.用斜杠划分区域——python解决_第2张图片
我们对列表遍历,如果是\,连接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

你可能感兴趣的:(力扣,leetcode,python)