题目描述
题解
这是一道典型的应用BFS的题。 nettee的题解 写得很好,很清楚。这位大神应该是擅长java的,所以python的代码写得不是很简洁,但是思路真的很好。
BFS的特点就是一层层地遍历,方便计算层数。DFS是先一条分支走到头,再下一条分支。
首先,循环一遍表格,找出所有的陆地,这就作为第0层的起点。
用一个变量distance记录层数。
开始BFS,整体用一个while循环,用来判断是否所有节点都走过一遍了。
- 先用一个变量n记录这一层有几个节点,这n个节点就是父节点,要将这几个节点都走过一遍后再到它们的子节点。
- 当循环到最后,就说明这个是最远的海洋,因为最开始的起点就是全部的陆地,所有的陆地都是同一层,在循环n里同时开始遍历。
我根据思路写了一遍代码
class Solution:
def maxDistance(self, grid: List[List[int]]) -> int:
land = []
L = len(grid)
for i in range(L):
for j in range(L):
if grid[i][j]:
land.append([i,j])
grid[i][j] = 2
# 如果全是陆地或海洋
if not land or len(land) == L*L:
return -1
direction = [[1,0],[-1,0],[0,1],[0,-1]]
distance = -1 # 注意这里要从-1开始,如果不明白的话,可以spyder断点运行一遍
while land:
distance += 1
n = len(land) # 将这一层的节点都划分出来循环
for k in range(n):
i,j = land.pop(0)
for w,q in direction:
raw,col = i+w,j+q
if -1<raw<L and -1<col<L and grid[raw][col]==0:
grid[raw][col] = 2
land.append([raw,col])
return distance