我有一个这样的网格:
000000000
0AAA00000
0AA000000
0AAA00000
000000000
000000000
000000B00
00000BBB0
00000BBBB
现在如何使用 BFS 找到从 A 到 B 的最短路径?在 A 和 A 之间旅行的成本是 0,而 A-0 或 0-B 或 0-0 是一。我已经尝试在每个 A 上单独应用 BFS 并取其最小值。但这似乎不起作用。还有其他方法吗?
我有一个这样的网格:
000000000
0AAA00000
0AA000000
0AAA00000
000000000
000000000
000000B00
00000BBB0
00000BBBB
现在如何使用 BFS 找到从 A 到 B 的最短路径?在 A 和 A 之间旅行的成本是 0,而 A-0 或 0-B 或 0-0 是一。我已经尝试在每个 A 上单独应用 BFS 并取其最小值。但这似乎不起作用。还有其他方法吗?
BFS 会好的。首先,您通过网格中 A 的所有位置来初始化队列。并且每次在队列的最前面弹出一个位置,同时将1步可以到达但尚未访问的所有位置推入。第一次访问 B 时,您会得到从 A 到 B 的最短路径。
多源BFS的工作方式与常规 BFS 完全相同,但不是从单个节点开始,而是将所有源 ( A
's) 放在队列的开头。也就是说,通过网格找到所有A
的并初始化你的 BFS 队列,所有这些队列都在距离 0 处。然后像往常一样继续 BFS。
这是一个 Python 实现示例:
from collections import deque
from itertools import product
def get_distance():
grid = [['0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', 'A', 'A', 'A', '0', '0', '0', '0', '0'],
['0', 'A', 'A', '0', '0', '0', '0', '0', '0'],
['0', 'A', 'A', 'A', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', '0', '0', '0'],
['0', '0', '0', '0', '0', '0', 'B', '0', '0'],
['0', '0', '0', '0', '0', 'B', 'B', 'B', '0'],
['0', '0', '0', '0', '0', 'B', 'B', 'B', 'B']]
R = C = 9 # dimensions of the grid
queue = deque()
visited = [[False]*C for _ in range(R)]
distance = [[None]*C for _ in range(R)]
for row, col in product(range(R), range(C)):
if grid[row][col] == 'A':
queue.append((row, col))
distance[row][col] = 0
visited[row][col] = True
while queue:
r, c = queue.popleft()
for row, col in ((r-1, c), (r, c+1), (r+1, c), (r, c-1)): # all directions
if 0 <= row < R and 0 <= col < C and not visited[row][col]:
distance[row][col] = distance[r][c] + 1
if grid[row][col] == 'B':
return distance[row][col]
visited[row][col] = True
queue.append((row, col))
print(get_distance()) # 6