959. 由斜杠划分区域(并查集)(傻瓜教程)(python)(LC)

959. 由斜杠划分区域

在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。

(请注意,反斜杠字符是转义的,因此 \ 用 “\” 表示。)。

返回区域的数目。


思路:并查集(只求连通分量个数)

「初始化:将每个方格化作4个三角(即四个连通分量)」
「合并:从方格内与方格间两个维度考虑」

一、N*N表格被填满,套用并查集模版

二、解题

class Solution:
    def regionsBySlashes(self, grid):

1.初始化(1个方格化4个三角)

		n = len(grid)
        N = n * n * 4
        uf = UF(N)

2.定位坐标

		def get_pos(row, col, i):
            return (row * n + col) * 4 + i

3.遍历

		for row in range(n):
            for col in range(n):
                v = grid[row][col]

4.合并

(1)方格间(对每个方格考虑与右侧和下侧的合并)

只要有,就要合并;其他方向也可以,只要不冲突

(2)方格内(根据斜杠和“空”的性质进行合并)
 if v == '/':
                    uf.union(get_pos(row, col, 0), get_pos(row, col, 1))
                    uf.union(get_pos(row, col, 2), get_pos(row, col, 3))
                if v == '\\':
                    uf.union(get_pos(row, col, 1), get_pos(row, col, 3))
                    uf.union(get_pos(row, col, 0), get_pos(row, col, 2))
                if v == ' ':
                    uf.union(get_pos(row, col, 0), get_pos(row, col, 1))
                    uf.union(get_pos(row, col, 1), get_pos(row, col, 2))
                    uf.union(get_pos(row, col, 2), get_pos(row, col, 3))

5.返回模版的计数
        return uf.cnt

完整代码

class UF:
  def __init__(self, M):
      self.parent = {
     }
      self.cnt = 0
      # 初始化 parent,size 和 cnt
      for i in range(M):
          self.parent[i] = i
          self.cnt += 1

  def find(self, x):
      if x != self.parent[x]:
          self.parent[x] = self.find(self.parent[x])
          return self.parent[x]
      return x
  def union(self, p, q):
      if self.connected(p, q): return
      leader_p = self.find(p)
      leader_q = self.find(q)
      self.parent[leader_p] = leader_q
      self.cnt -= 1
  def connected(self, p, q):
      return self.find(p) == self.find(q)

class Solution:
    def regionsBySlashes(self, grid):
        n = len(grid)
        N = n * n * 4
        uf = UF(N)
        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.union(get_pos(row - 1, col, 2), get_pos(row, col, 1))
                if col > 0:
                    uf.union(get_pos(row, col - 1, 3), get_pos(row, col, 0))
                if v == '/':
                    uf.union(get_pos(row, col, 0), get_pos(row, col, 1))
                    uf.union(get_pos(row, col, 2), get_pos(row, col, 3))
                if v == '\\':
                    uf.union(get_pos(row, col, 1), get_pos(row, col, 3))
                    uf.union(get_pos(row, col, 0), get_pos(row, col, 2))
                if v == ' ':
                    uf.union(get_pos(row, col, 0), get_pos(row, col, 1))
                    uf.union(get_pos(row, col, 1), get_pos(row, col, 2))
                    uf.union(get_pos(row, col, 2), get_pos(row, col, 3))

        return uf.cnt

你可能感兴趣的:(傻瓜教程(LC),python,leetcode)