【网格问题】leetcode694.不同岛屿的数量

461 篇文章 1 订阅
125 篇文章 2 订阅

题目:
在这里插入图片描述
在这里插入图片描述

思路:
如果两个岛屿可以通过平移变换(不包括旋转和翻转)和另一个岛屿重合,说明两个岛屿是相同的。
我们给一个岛屿的所有网格都记录坐标,以岛屿的最左上角网格作为起点,其他网格减去这个起点,得到的岛屿网格坐标就是一个相对值。如果两个岛屿的相对值一一对应,说明是同一个岛屿。
最后将岛屿的相对坐标连在一起组成字符串,放入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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值