目录
一.完整代码
list1 = [[1,1,0,1,1],[1,0,0,0,0],[0,0,0,0,1],[1,1,0,1,1]]
def numDistinctIslands(list1):
row = len(list1)
col = len(list1[0])
set1 = set()
for i in range(row):
for j in range(col):
if list1[i][j]==1:
ac = []
dfs(list1,i,j,ac,1)
set1.add(" ".join(map(str,ac)))
return len(set1)
def dfs(grid,i,j,sb,nums):
m = len(grid)
n = len(grid[0])
if(i<0 or i>=m or j<0 or j>=n):
return
if(grid[i][j]==0):
return
grid[i][j] = 0
sb.append(nums)
dfs(grid,i-1,j,sb,1)
dfs(grid,i+1,j,sb,2)
dfs(grid,i,j-1,sb,3)
dfs(grid,i,j+1,sb,4)
sb.append(-nums)
res = numDistinctIslands(list1)
print(res)
二. 本题三个关键
1. 巧用集合set()函数. 由于相同的岛屿的ac数列是一致的,用集合来写的话,相同岛屿的数列不会添加二次,我们最终就可以用set1这个集合内的元素个数来判断不同的岛屿数量。
注意:在创建一个空集合时,要用set函数,不要用{},会被误判为使用了字典。
set1 = set() -> 集合
set1 = {} -> 字典
2.dfs回溯遍历,不同的形状(不同的二叉树)遍历得到的路径(数字)不同(岛屿序列化的结果)作为判断岛屿是否相同的依据。
3.遇岛淹岛,防止后续死循环。
三.总结.
本题主要考察了用DFS/BFS算法解决岛屿问题。