问题描述:
给你一个大小为
n x n
的二元矩阵grid
,其中1
表示陆地,0
表示水域。岛 是由四面相连的
1
形成的一个最大组,即不会与非组内的任何其他1
相连。grid
中 恰好存在两座岛 。你可以将任意数量的
0
变为1
,以使两座岛连接起来,变成 一座岛 。返回必须翻转的
0
的最小数目。
示例 1:
输入:grid = [[0,1],[1,0]]
输出:1
示例 2:
输入:grid = [[0,1,0],[0,0,0],[0,0,1]]
输出:2
示例 3:
输入:grid = [[1,1,1,1,1],[1,0,0,0,1],[1,0,1,0,1],[1,0,0,0,1],[1,1,1,1,1]]
输出:1
提示:
n == grid.length == grid[i].length
2 <= n <= 100
grid[i][j] 为 0 或 1
grid 中恰有两个岛
解决方案:
深度搜索加广度搜索
class Solution(object):
def shortestBridge(self, grid):
n = len(grid)
for i, row in enumerate(grid):
for j, v in enumerate(row):
if v != 1:
continue
q = []
def dfs(x, y):
grid[x][y] = -1
q.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:
dfs(nx, ny)
dfs(i, j)
step = 0
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