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