问题:在一个由0、1组成的二维矩阵里,上下左右四个方向相连的1组成岛屿,而其他0的区域表示海洋。如果在矩阵里有两个岛屿,我们可以修建一座桥把两个岛屿连起来。修建桥的办法是把0翻转成上下左右四个方向相连的1。请问至少需要翻转多少个0才能将两个岛屿连起来?例如,在下面的二维矩阵中,我们只需要翻转坐标为(1, 1)和(2, 1)的两个0,或者坐标为(0, 2)和(1, 2)的两个0,就可以把两个岛屿连起来,因此桥的最短长度为2。
[[0, 1, 0],
[0, 0, 0],
[0, 0, 1]]
分析:这是LeetCode的934题。
有很多面试题的输入都是0、1组成的二维矩阵,其中上下左右四个方向相连的1组成岛屿。这种类型的题目都可以把二维矩阵看成图,矩阵中的每个数字是图中的节点,而节点与上下左右四个方向的其他节点相连,因此每个节点最多有四条边。
这个题目的输入的矩阵中含有两个岛屿。我们先找出其中任意一个岛屿,然后再求出这个岛屿到另外一个岛屿之间桥的最短长度。
为了找出其中一个岛屿,我们先扫描输入的矩阵找到任意一个1,然后从这个1出发,遍历所有和它相连的1找到它所在岛屿的所有1。这里我们可以使用广度优先搜索或者深度优先搜索算法去遍历岛屿上的所有1。下面的参考代码使用广度优先搜索算法: