问题描述
在由 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] 是 ‘/’、’’、或 ’ '。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/regions-cut-by-slashes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析及代码实现
这道题也是一个完全的并查集,根据题目和例子,可以分析出1x1的方格,被/,\划分成了四部分:
上侧是0,右侧是1,下侧是2,左侧是3
1.如果是“/”,可以两两合并
2.如果是“\”,也可以两两合并
3.如果是空,那么四个一起合并
这是在一个格子里的情况,还有相邻的两个格子之间,包括左侧格子的右侧和右侧格子的左侧是相连的,当前格子的下侧与下侧格子的上侧是相连的
这样我们就可以写出代码
'''并查集部分'''
class DSU:
def __init__(self,n):
self.father = [i for i in range(4*n*n)]
def find(self, x):
if x != self.father[x]:
self.father[x] = self.find(self.father[x])
return self.father[x]
def union(self, a, b):
x = self.find(a)
y = self.find(b)
if x != y:
self.father[x] = y
class Solution:
def regionsBySlashes(self, grid: List[str]) -> int:
n = len(grid)
dsu = DSU(n)
for i in range(n):
for j in range(n):
start = 4 * (i * n + j)
if grid[i][j] == "/":
dsu.union(start+0, start+3)
dsu.union(start+1, start+2)
elif grid[i][j] == "\\":
dsu.union(start+0, start+1)
dsu.union(start+2, start+3)
else:
dsu.union(start+0, start+1)
dsu.union(start+0, start+2)
dsu.union(start+0, start+3)
if i < n - 1:
dsu.union(start + 2, start + n * 4)
if j < n - 1:
dsu.union(start + 1, start + 7)
dsu_set = set()
for i in range(4 * n ** 2):
dsu_set.add(dsu.find(i))
return len(dsu_set)