题目:
959.由斜杠划分区域
在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。
(请注意,反斜杠字符是转义的,因此 \ 用 “\” 表示。)。
返回区域的数目。
示例 1:
输入:
[
" /",
“/ "
]
输出:2
解释:2x2 网格如下:
示例2:
输入:
[
" /”,
" "
]
输出:1
解释:2x2 网格如下:
示例3:
输入:
[
“\/”,
“/\”
]
输出:4
解释:(回想一下,因为 \ 字符是转义的,所以 “\/” 表示 /,而 “/\” 表示 /\。)
2x2 网格如下:
示例4:
输入:
[
“/\”,
“\/”
]
输出:5
解释:(回想一下,因为 \ 字符是转义的,所以 “/\” 表示 /\,而 “\/” 表示 /。)
2x2 网格如下:
示例5:
输入:
[
“//”,
"/ "
]
输出:3
解释:2x2 网格如下:
提示:
- 1 <= grid.length == grid[0].length <= 30
- grid[i][j] 是 ‘/’、’’、或 ’ '。
解题思路:
用并查集,来查找连通区域的数量。每个格子可能被 / 或者 \ 分为上下左右四个部分,然后分别表示出四个部分。
代码:
class Solution:
def regionsBySlashes(self, grid: List[str]) -> int:
n = len(grid)
parent = [i for i in range(4 * n * n)]
def find(x):
if x == parent[x]:
return x
parent[x] = find(parent[x])
return parent[x]
def union(x, y):
xr = find(x)
yr = find(y)
if xr < yr:
parent[yr] = xr
elif xr > yr:
parent[xr] = yr
for i, row in enumerate(grid):
for j, s in enumerate(row):
up = i * n * 4 + j * 4
down = i * n * 4 + j * 4 + 1
left = i * n * 4 + j * 4 + 2
right = i * n * 4 + j * 4 + 3
if s == ' ':
union(up, down)
union(up, left)
union(up, right)
elif s == '\\':
union(left, down)
union(right, up)
elif s == '/':
union(left, up)
union(right, down)
if i > 0:
up_down = (i - 1) * n * 4 + j * 4 + 1
union(up, up_down)
if j > 0:
right_left = i * n * 4 + (j - 1) * 4 + 3
union(right_left, left)
if i < n - 1:
union((i + 1) * n * 4 + j * 4, down)
if j < n - 1:
union(i * n * 4 + (j + 1) * 4 + 2, right)
res = set()
for i in range(len(parent)):
r = find(i)
res.add(r)
return len(res)
提交记录: