当前位置: 首页 > 编程笔记 >

在Python中将一个水单元更改为陆地单元后找到最大岛屿的程序

阮阳曦
2023-03-14
本文向大家介绍在Python中将一个水单元更改为陆地单元后找到最大岛屿的程序,包括了在Python中将一个水单元更改为陆地单元后找到最大岛屿的程序的使用技巧和注意事项,需要的朋友参考一下

假设我们有一个二元矩阵,其中1代表土地,0代表水。一个岛屿是由水包围的一组1。我们必须找到最大的岛屿的大小。我们最多只能将一个水单元更改为陆单元。

所以,如果输入像

1 0 1
0 0 0
1 1 0
1 1 1

则输出将为7,因为我们可以将一个水单元降落以连接两个岛屿。所以最终矩阵就像-

1 0 1
0 0 0
1 1 0
1 1 1

为了解决这个问题,我们将遵循以下步骤-

  • R:=垫子的行数,C:=垫子的列数

  • 质量:=新映射

  • id:= 555

  • 定义一个功能floodfill()。这将需要r,c,id

  • 如果r和c在矩阵范围内并且mat [r,c]为1,则

    • Floodfill(R2,C2,ID)

    • mat [r,c]:= id

    • 质量[ID]:=质量[ID] + 1

    • 对于[[r + 1,c),(r − 1,c),(r,c +1),(r,c − 1)]中的每一对(r2,c2)

    • 从主要方法中执行以下操作-

    • 对于0到R范围内的r,执行

      • 如果mat [r,c]与1相同,则

      • id:= id + 1

      • mass [id]:= 0

      • floodfill(r, c, id)

      • 对于0到C范围内的c,执行

      • ans:=的最大值(质量和1的所有值)

      • 对于0到R − 1范围内的r

        • 如果mat [r,c]不等于0,则

        • island_set:=一个新集合

        • 对于[[r + 1,c),(r − 1,c),(r,c +1),(r,c − 1)]中的每一对(r2,c2)

        • 进行下一次迭代

        • 将mat [r2,c2]添加到island_set

        • 如果r2和c2在mat的范围内,并且mat [r2,c2]为1,则

        • ans:= ans的最大值和(1 + island_set中每个岛的所有质量[岛]的总和)

        • 对于0到C − 1范围内的c

        • 返回ans

        让我们看下面的实现以更好地理解-

        示例

        class Solution:
           def solve(self, mat):
              R, C = len(mat), len(mat[0])
              mass = {}
              id = 555
              def floodfill(r, c, id):
                 nonlocal R, C, mat, mass
                 if 0 <= r < R and 0 <= c < C and mat[r][c] == 1:
                    mat[r][c] = id
                    mass[id] += 1
                    for r2, c2 in [(r + 1, c), (r − 1, c), (r, c + 1),
                       (r, c − 1)]:
                       floodfill(r2, c2, id)
                          for r in range(R):
              for c in range(C):
                 if mat[r][c] == 1:
                    id += 1
                    mass[id] = 0
                    floodfill(r, c, id)
              ans = max([val for val in mass.values()] + [1])
              for r in range(R):
                 for c in range(C):
                    if mat[r][c] != 0:
                       continue
                    island_set = set()
                    for r2, c2 in [(r + 1, c), (r − 1, c), (r, c + 1),(r, c − 1)]:
                       if 0 <= r2 < R and 0 <= c2 < C and mat[r2][c2]:
                          island_set.add(mat[r2][c2])
                       ans = max(ans, 1 + sum([mass[island] for island in island_set]))
                 return ans
        ob = Solution()
        matrix = [
           [1, 0, 1],
           [0, 0, 0],
           [1, 1, 0],
           [1, 1, 1]
        ]
        print(ob.solve(matrix))

        输入值

        [
        [1, 0, 1],
        [0, 0, 0],
        [1, 1, 0],
        [1, 1, 1] ]
        输出结果
        7

         类似资料:
        • 在单链表中,我们知道最后一个节点的下一个指向,这样我们就可以通过遍历找到它。 如果单链表的最后一个节点指向某个中间节点,那么我们如何找到最后一个节点?

        • 本文向大家介绍在Scala中找到列表的最后一个元素,包括了在Scala中找到列表的最后一个元素的使用技巧和注意事项,需要的朋友参考一下 假设我们在Scala中有一个列表,该列表在scala.collection.immutable包下定义。众所周知,列表是相同类型元素的集合,其中包含不可变(不可更改)数据。我们通常应用last函数来显示列表的最后一个元素。 使用最后一个关键字 以下Scala代码显

        • 如何在下面的代码中获取流或列表的最后一个元素? 其中是: 正如您所看到的,使用特定的获取第一个元素并不难。 null 我看不出在接口中没有提供和方法的任何理由,因为其中的元素是有序的,而且大小是已知的。 但正如最初的答案:如何获得有限的最后一个元素? 就我个人而言,这是我能得到的最接近的结果:

        • 问题内容: 我的折扣列有一个自动完成功能,其值来自另一个json变量。 这是我的json数组,折扣数据来自此数组。 What I would like to do is (1)更改折扣值后,“ 费用”列应 根据此公式进行更改 值0.145来自json的id列。 (2)在更改折价后,ExtCost列应 据此更改。 数量是最左侧的单元格。 这是我的网格相关代码。 问题答案: 您没有提供有效的演示,但希

        • 问题内容: 谁能解释为什么在Python中将单个元素元组解释为该元素? 和 他们为什么不只是将元组打印为? 请参阅以下示例: 问题答案: 单个元素元组永远不会被视为包含的元素。括号对分组最有用,而不是对元组的创建。逗号会这样做。 他们为什么不只将(1,)打印为(1)? 可能是因为打印内置容器类型提供了一种表示形式,可用于通过表示重新创建容器对象,例如: 的docs在此方面提供了一些清晰度: 如果可

        • 问题内容: 我有一个〜10 ^ 6元组的列表,像这样: 我想在此列表中找到Y的最大值,但也想知道绑定到的X。 我该怎么做呢? 问题答案: 用途: 使用: 使用: 比较: