📅  最后修改于: 2023-12-03 14:51:23.762000             🧑  作者: Mango
二进制矩阵是由一些只包含 0 或 1 的行和列组成的矩阵。在本题中,所有边缘上的元素都被认为是 0。我们将这些边缘上的 0 称为「水」。
从左上角开始出发,每次可以向上下左右四个方向走,但是不能走到「水」里面。对于任意一个位置,可以查看它能够到达的最远距离,求最大的这样的距离。
以下是一个例子:
1 1 1 1 0
1 0 0 1 0
1 1 0 1 1
1 1 1 0 1
对于这个例子,最大的距离是 3,从 (0,0) 出发,可以走到 (1,3),(2,2),(3,1) 或者 (4,4)。
本题可以使用广度优先搜索来实现。具体做法如下:
下面是使用 Python 实现的示例代码:
from collections import deque
def maxDistance(matrix):
"""
:type matrix: List[List[int]]
:rtype: int
"""
n = len(matrix)
m = len(matrix[0])
queue = deque()
# 将所有边缘上的 0 加入队列
for i in range(n):
for j in range(m):
if matrix[i][j] == 0:
queue.append((i, j))
# 广度优先搜索
ans = -1
while queue:
size = len(queue)
for _ in range(size):
x, y = queue.popleft()
for dx, dy in [(1,0), (-1,0), (0,1), (0,-1)]:
nx, ny = x+dx, y+dy
if 0 <= nx < n and 0 <= ny < m and matrix[nx][ny] == 1:
matrix[nx][ny] = matrix[x][y] + 1
ans = max(ans, matrix[nx][ny] - 1)
queue.append((nx, ny))
return ans if ans != -1 else 0
注意:上述代码中使用了 Python 内置的 deque
类来实现队列。
在最坏情况下,每个位置都会被遍历一次。因此,时间复杂度为 O(nm)。