📜  使两个岛屿在网格中连接的最小水陆转换次数(1)

📅  最后修改于: 2023-12-03 15:22:07.940000             🧑  作者: Mango

使两个岛屿在网格中连接的最小水陆转换次数

在网格中,有两个岛屿需要连接。 你可以选择两点之间通过水路或陆地进行连接。 给定网格中的两个岛屿位置坐标,编写一个函数来计算它们之间的最小转换次数。 每个单元格可以通过以下方式进行转换:

  • 如果单元格为水域,可以将其转换为陆地
  • 如果单元格为陆地,则可以将其转换为水域。

转换的次数是指网格中所有单元格的转换总次数。

算法

为了找到两个岛屿之间的最短路径,我们可以使用广度优先搜索(BFS)算法来遍历网格。 在BFS中,我们从一个起始点开始遍历,然后遍历其相邻节点,将它们加入队列中。 在此过程中,我们需要记录已经遍历过的节点,并使用矩阵记录最小转换次数。

代码实现
from collections import deque

class Solution:
    def minTransfers(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])

        # find the positions of two islands
        land1, land2 = [], []
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1:
                    land1.append((i,j))
                else:
                    land2.append((i,j))

        # calculate the shortest distance between two islands
        res = float('inf')
        for p1 in land1:
            dist = self.bfs(grid, p1, land2)
            res = min(res, dist)

        return res

    def bfs(self, grid, start, end):
        m, n = len(grid), len(grid[0])
        queue = deque([(start[0], start[1], 0)])
        visited = set([(start[0], start[1])])

        while queue:
            x, y, dist = queue.popleft()
            if (x, y) in end:
                return dist

            for dx, dy in [(0,1),(1,0),(0,-1),(-1,0)]:
                nx, ny = x + dx, y + dy
                if 0 <= nx < m and 0 <= ny < n and (nx, ny) not in visited:
                    visited.add((nx, ny))
                    if grid[nx][ny] == grid[x][y]:
                        queue.append((nx, ny, dist))
                    else:
                        queue.append((nx, ny, dist+1))

        return float('inf')
复杂度分析
  • 时间复杂度:O(mn(m+n))
  • 空间复杂度:O(mn)