在Python中找到两个岛屿之间最短桥的程序
假设我们有一个二进制矩阵,其中0代表水,1代表陆地。一个岛屿是四个方向上连接的1组成的群体。岛屿要么被0(水)包围,要么被边缘包围。我们必须找到连接两个岛屿的最短桥的长度。
因此,如果输入如下:
0 | 0 | 1 |
---|---|---|
1 | 0 | 1 |
1 | 0 | 0 |
那么输出将是1。这将连接(1,0)和(1,2)这两个点。
为了解决这个问题,我们将按照以下步骤进行:
- row := 矩阵的行数
-
col := 矩阵的列数
-
定义一个函数 dfs(),它将获取 i,j,s
-
如果 (i,j) 在 s 中,则
- 返回
- 如果 mat[i,j] 等于 0,则
- 返回
- 将 (i,j) 插入 s
-
如果 i – 1 >= 0,则
- dfs(i – 1,j,s)
- 如果 i + 1 < row,则
- dfs(i + 1,j,s)
- 如果 j – 1 >= 0,则
- dfs(i,j – 1,s)
- 如果 j + 1 < col,则
- dfs(i,j + 1,s)
- 从主方法执行以下操作
-
seen := 一个新集合
-
对于范围从 0 到行的 i,执行
- 如果 seen 的大小 > 0,则
- 退出循环
- 对于范围从 0 到列的 j,执行
- 如果 mat[i,j] 等于 1,则
-
dfs(i,j,seen)
-
退出循环
- 如果 seen 的大小 > 0,则
-
q := 一个双向队列
-
对于 seen 中的每个陆地执行
- (i,j) := land
-
如果 i – 1 >= 0 并且 mat[i – 1,j] 等于 0,则
- 将 (i – 1,j,1) 插入 q 的末尾
- 如果 i + 1 < row 并且 mat[i + 1,j] 等于 0,则
- 将 (i + 1,j,1) 插入 q 的末尾
- 如果 j – 1 >= 0 并且 mat[i,j – 1] 等于 0,则
- 将 (i,j – 1,1) 插入 q 的末尾
- 如果 j + 1 < col 并且 mat[i,j + 1] 等于 0,则
- 将 (i,j + 1,1) 插入 q 的末尾
- 当 q 的大小 > 0 时,执行以下操作:
- (i,j,dist) := q 的左侧项目,并从左侧删除项目
-
如果 (i,j) 被 seen 标记,则
- 进入下一次循环
- 将 (i,j) 标记为 seen
-
如果 mat[i,j] 等于 1,则
- 返回 dist – 1
- 如果 i – 1 >= 0,则
- 将 (i – 1,j,dist + 1) 插入 q 的末尾
- 如果 i + 1 < row,则
- 将 (i + 1,j,dist + 1) 插入 q 的末尾
- 如果 j – 1 >= 0,则
- 将 (i,j – 1,dist + 1) 插入 q 的末尾
- 如果 j + 1 < col,则
- 将 (i,j + 1,dist + 1) 插入 q 的末尾
示例
让我们看以下实现以获得更好的理解−