0%

leetCode-934:Shortest Bridge

问题描述

给定一个由 01 组成的二维矩阵,其中由 1 组成的连续区块表示一个小岛(用 0 隔开),题目明确有两个小岛,要求找出连接两个小岛之间的最短桥梁距离(通过将 0 变成 1 表示建桥梁)。题目链接:**点我**

样例输入

输入:[[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

输入:[[0,1,0],[0,0,0],[0,0,1]]

输出:2

问题解法

先用深搜找出一个小岛,将其每个节点放入队列中,然后用广搜查找这个小岛到另一个小岛的距离。队列中最先达到另一个小岛的节点距离就是两个小岛中的最短距离。代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
class Node
{
int x;
int y;

public Node(int x, int y)
{
this.x = x;
this.y = y;
}
}

class Solution
{
private int[] dx = {0, 1, 0, -1};

private int[] dy = {-1, 0, 1, 0};

private void searchFirstIsland(int[][] matrix, Queue<Node> queue, int x, int y)
{
if (!isValid(x, y, matrix) || matrix[x][y] != 1)
{
return;
}

queue.offer(new Node(x, y));
matrix[x][y] = 2;

for (int i = 0; i < 4; i++)
{
searchFirstIsland(matrix, queue, x + dx[i], y + dy[i]);
}
}

private Node getFirstNode(int[][] matrix)
{
for (int i = 0; i < matrix.length; i++)
{
for (int j = 0; j < matrix[0].length; j++)
{
if (matrix[i][j] == 1)
{
return new Node(i, j);
}
}
}

return new Node(0, 0);
}

private boolean isValid(int x, int y, int[][] matrix)
{
return x >=0 && x < matrix.length && y >= 0 && y < matrix[0].length;
}

public int shortestBridge(int[][] A)
{
Queue<Node> queue = new ArrayDeque<>();
Node node = getFirstNode(A);
searchFirstIsland(A, queue, node.x, node.y);

int count = 0;
while (!queue.isEmpty())
{
for (int i = queue.size(); i > 0; i--)
{
Node current = queue.poll();
for (int k = 0; k < 4; k++)
{
int x = current.x + dx[k];
int y = current.y + dy[k];
if (!isValid(x, y, A))
{
continue;
}

if (A[x][y] == 1)
{
return count;
}

if (A[x][y] == 0)
{
queue.offer(new Node(x, y));
A[x][y] = -1;
}
}
}
count++;
}

return count;
}
}