📅  最后修改于: 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')