一、题目链接
二、解题思路
广度优先搜索来找到矩阵中两个块的最短距离。首先找到其中一座岛,然后将其不断向外延伸一圈,直到到达了另一座岛,延伸的圈数即为最短距离。广度优先搜索时,我们可以将已经遍历过的位置标记为 −1。
三、代码
class Solution(object):
def shortestBridge(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
n = len(grid)
for i, row in enumerate(grid):
for j, v in enumerate(row):
if v != 1:
continue
island = []
grid[i][j] = -1
q = deque([(i, j)])
while q:
x, y = q.popleft()
island.append((x, y))
for nx, ny in (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1):
if 0 <= nx < n and 0 <= ny < n and grid[nx][ny] == 1:
grid[nx][ny] = -1
q.append((nx, ny))
step = 0
q = island
while True:
tmp = q
q = []
for x, y in tmp:
for nx, ny in (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1):
if 0 <= nx < n and 0 <= ny < n:
if grid[nx][ny] == 1:
return step
if grid[nx][ny] == 0:
grid[nx][ny] = -1
q.append((nx, ny))
step += 1