题目:
思路:
如果两个岛屿可以通过平移变换(不包括旋转和翻转)和另一个岛屿重合,说明两个岛屿是相同的。
我们给一个岛屿的所有网格都记录坐标,以岛屿的最左上角网格作为起点,其他网格减去这个起点,得到的岛屿网格坐标就是一个相对值。如果两个岛屿的相对值一一对应,说明是同一个岛屿。
最后将岛屿的相对坐标连在一起组成字符串,放入SET中。最终,SET的大小就是结果。
解答:
class Solution:
def difLands(self, grid) -> int:
m = len(grid)
n = len(grid[0])
direction = [[-1, 0], [1, 0], [0, -1], [0, 1]]
def InArea(i, j):
if 0 <= i < m and 0 <= j < n:
return True
return False
# 遍历所有(i,j)出发可抵达的土地,并将其置为2(即标记为已访问)
# 并用tmp记录当前土地相对出发点(ox,oy)的偏移量
def dfs(i, j,tmp,ox,oy):
if not InArea(i, j):
return
if grid[i][j] != 1:
return
# 递归搜素
grid[i][j] = 2
tmp+=[str(i-ox),str(j-oy)]
for dx, dy in direction:
dfs(i + dx, j + dy,tmp,ox,oy)
res=set()
for i in range(m):
for j in range(n):
if grid[i][j] == 1:
tmp=[] #记录相对坐标
dfs(i, j,tmp,i,j)
res.add(''.join(tmp))
#print(res)
return len(res)