这道题要给出不同岛屿的数量,最直观的想法就是对发现的不同岛屿进行序列化,然后把序列化结果存到HashSet,那怎么序列化呢?
其实比较类似于二叉树的序列化,记录遍历顺序(方向),这里用
⽤ 1, 2, 3, 4 代表上下左右,⽤ -1, -2, -3, -4 代表上下左右的撤销,前序后续位置分别增加遍历顺序,即可实现序列化。
关于岛屿的相似题目:
python
class NumDistinctIslands:
"""
694 不同岛屿的数量
https://leetcode.cn/problems/number-of-distinct-islands/
"""
def solution(self, grid):
islands = set()
m, n = len(grid), len(grid[0])
# 遍历grid,就是所有的封闭岛屿
for i in range(m):
for j in range(n):
# 淹掉这个岛屿,同时存储岛屿的序列化结果
if grid[i][j] == 1:
self.sb = ''
# 初始的⽅向可以随便写,不影响正确性
dir = 666
self.dfs_matrix(grid, i, j, dir)
islands.add(self.sb)
return islands
def dfs_matrix(self, grid, i, j, dir):
m, n = len(grid), len(grid[0])
# 跳出递归条件
if i < 0 or i >= m or j < 0 or j >= n:
return
if grid[i][j] == 0:
return
# 前序序遍历位置:进入(i, j)
grid[i][j] = 0
self.sb += str(dir) + ','
self.dfs_matrix(grid, i - 1, j, 1) # 上
self.dfs_matrix(grid, i + 1, j, 2) # 下
self.dfs_matrix(grid, i, j - 1, 3) # 左
self.dfs_matrix(grid, i, j + 1, 4) # 右
# 后序遍历位置:离开 (i, j)
self.sb += str(-dir) + ','