Python程序:逐块添加方块到网格中,计算岛屿数量


假设我们有一个无限大的水域网格。我们可以逐个向该网格添加陆地块。我们有一个坐标列表,称为land_requests,其中每个坐标都采用[r, c]的形式,其中r代表行,c代表列。我们必须找到一个列表,其中每个元素代表在添加land_requests中的每个陆地块后存在的岛屿数量。

因此,如果输入类似于land_requests = [[1, 1],[2, 4],[1, 2],[1, 4],[1, 3]],则输出将为[1, 2, 2, 2, 1],原因如下:

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

  • d := 方向列表,例如[(−1, 0) ,(0, 1) ,(1, 0) ,(0, −1) ]

  • idx := 0

  • mp := 新建地图

  • p := 新建列表

  • size := 新建列表

  • comp := 0

  • ans := 新建列表

  • 定义函数 search()。它将接收 u

  • 如果 u 等于 p[u],则

    • 返回 u

    • p[u] := search(p[u])

  • 返回 p[u]

  • 定义函数 connect()。它将接收 u, v

  • pu := search(u), pv := search(v)

  • 如果 pu 等于 pv,则

    • 返回

  • comp := comp − 1

  • 如果 size[pu] >= size[pv],则

    • p[pv] := pu

    • size[pu] := size[pu] + size[pv]

  • 否则,

    • p[pu] := pv

    • size[pv] := size[pv] + size[pu]

  • 在主方法中执行以下操作:

  • 对于 land_requests 中的每个请求,执行以下操作:

    • (i, j) := request

    • mp[i, j] := idx

    • 将 idx 插入 p 的末尾

    • 将 1 插入 size 的末尾

    • idx := idx + 1

    • comp := comp + 1

    • 对于 d 中的每个 k,执行以下操作:

      • ni := i + k[1]

      • nj := j + k[0]

      • 如果 (ni, nj) 存在于 mp 中,则

        • connect(mp[(i, j)], mp[(ni, nj)])

    • 将 comp 插入 ans 的末尾

  • 返回 ans

让我们来看下面的实现,以便更好地理解:

示例

 在线演示

d = [(−1, 0), (0, 1), (1, 0), (0, −1)]
class Solution:
   def search(self, u):
      if u == self.p[u]:
         return u
      self.p[u] = self.search(self.p[u])
      return self.p[u]
   def connect(self, u, v):
      pu = self.search(u)
      pv = self.search(v)
      if pu == pv:
         return
      self.comp −= 1
      if self.size[pu] >= self.size[pv]:
         self.p[pv] = pu
         self.size[pu] += self.size[pv]
      else:
         self.p[pu] = pv
         self.size[pv] += self.size[pu]
   def solve(self, land_requests):
      self.idx = 0
      self.mp = dict()
      self.p = []
      self.size = []
      self.comp = 0
      ans = []
         for request in land_requests:
         i, j = request
         self.mp[(i, j)] = self.idx
         self.p.append(self.idx)
         self.size.append(1)
         self.idx += 1
         self.comp += 1
         for k in d:
            ni = i + k[1]
            nj = j + k[0]
            if (ni, nj) in self.mp:
               self.connect(self.mp[(i, j)], self.mp[(ni, nj)])
         ans.append(self.comp)
      return ans
ob = Solution()
land_requests = [[1, 1],[2, 4],[1, 2],[1, 4],[1, 3]]
print(ob.solve(land_requests))

输入

[[1, 1],[2, 4],[1, 2],[1, 4],[1, 3]]

输出

[1, 2, 2, 2, 1]

更新于:2020-12-26

122 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告