3.12学习——关于BFS算法的初步学习及迷宫问题的应用

学习资料

关于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算法更适用于找出所有的可能性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值