关于BFS算法
BFS算法即广度优先搜索,在进行搜索时会优先探索同层内的所有可能再往下去探索,就好比水波扩散一样,一层一层的。核心思想就是讲究广度,从起始节点开始,依次访问与其距离为 1、2、3……的节点。
与DFS算法的区别
两个算法存在本质上的逻辑不同,DFS算法形象的说法就是一条路走到黑,不撞南墙不回头;而BFS算法就好比是火焰的扩散,只有第一区域都被点燃才会向下一区域扩散。
而在迷宫问题的应用上,BFS算法会比DFS算法更快,BFS算法会一层一层地历遍,DFS算法则会一直深入直到无法继续再回溯
BFS算法在迷宫问题上的实现
核心思想:队列
参考资料
按照流程就是先探索离起点一步远的所有点,接着再去探索两步远的地方,接着三步…
接下来用代码来实现
from collections import deque
# 读取迷宫地图
with open('map.txt', 'r') as f:
maze = [list(line.strip()) for line in f]
# 寻找起点和终点
start = None
end = None
for i in range(len(maze)):
for j in range(len(maze[i])):
if maze[i][j] == 'A':
start = (i, j)
elif maze[i][j] == 'B':
end = (i, j)
if not start or not end:
print("地图中缺少起点A或终点B")
exit()
# 定义移动方向和对应的字符
directions = [
('W', -1, 0), # 上(前)
('S', 1, 0), # 下(后)
('A', 0, -1), # 左
('D', 0, 1) # 右
]
# 初始化BFS
queue = deque()
queue.append((start[0], start[1], ""))
visited = [[False]*len(row) for row in maze]
visited[start[0]][start[1]] = True
found = False
shortest_path = ""
# BFS遍历
while queue:
row, col, path = queue.popleft()
# 到达终点
if (row, col) == end:
shortest_path = path
found = True
break
# 尝试四个方向
for direction in directions:
char, dr, dc = direction
new_row = row + dr
new_col = col + dc
# 检查边界和可通行性
if 0 <= new_row < len(maze) and 0 <= new_col < len(maze[0]):
if not visited[new_row][new_col] and maze[new_row][new_col] != '$':
visited[new_row][new_col] = True
queue.append((new_row, new_col, path + char))
# 输出结果
if found:
print(shortest_path)
else:
print("无法从起点A到达终点B")
这样就可以实现用BFS算法寻找最短路径
BFS算法的拓展应用
BFS算法除了可以被用在迷宫寻路的方面,还可以用来连通性检测,而且与DFS算法不同的是,BFS在用来寻找最短路径上更有优势,而DFS算法更适用于找出所有的可能性