BFS常规思路
while queue 不空:
cur = queue.pop()
for 节点 in cur的所有相邻节点(上下左右):
if 该节点满足边界条件且未访问过:
queue.push(该节点)
计数方法通过层次遍历 遍历层次+1 计数+1
Leetcode 1162
题目要求:
你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地。
请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的,并返回该距离。如果网格上只有陆地或者海洋,请返回 -1。
思路:
point1:行、列数 以及设置visit_list (全为0,加入队列则表示为第n层次的点,并将赋值改为1)
point2:对队列中的点进行上下左右移动 直至所有点均为访问过(visit全为1)
point3:返回res需要-1 原因是在倒数第二层时,会将倒数第一层的点添加进队列,此时访问列表中,已经均被访问,无需进入下一层。
point4:全为陆地以及全为海洋,也就是全为0或者全为1的情况判断,全为0时,len(queue)=0 全为1时,len(queue0 = col*row
class Solution:
def maxDistance(self, grid: List[List[int]]) -> int:
col = len(grid)
row = len(grid[0])
queue = collections.deque()
visit_list = [[0]*row for i in range(col)]
for i in range(col):
for j in range(row):
if grid[i][j] == 1:
queue.append((i,j))
visit_list[i][j] = 1
res = 0
move_step = [[0,1],[0,-1],[1,0],[-1,0]]
while queue:
size = len(queue)
if size == col*row:
return -1
for i in range(size):
x,y = queue.popleft()
for dx,dy in move_step:
new_x,new_y = x + dx, y + dy
if new_x < 0 or new_y < 0 or new_x >= col or new_y >= row or visit_list[new_x][new_y] == 1:
continue
queue.append((new_x,new_y))
visit_list[new_x][new_y] = 1
res += 1
return res - 1