欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

广度优先搜索BFS

程序员文章站 2022-05-21 15:17:31
...

迷宫题:

给定一个二维矩阵,1表示不能走,0表示能走。再给定一个起点和终点,只可以上下左右,求出最短路径。

广度优先搜索依次搜索走1步、走2步、走3步能到的位置,走的路径逐渐增大,到终点时立即返回,所以最终当函数返回时一定是最短路径。

from collections import deque

dirs = [(-1,0),(1,0),(0,-1),(0,1)] #上下左右
arrows = ['^','v','<','>']

class Node:
    def __init__(self, x, y, deep, path):
        self.x = x
        self.y = y
        self.deep = deep    #保存到达当前点走了多少步
        self.path = path    #表示到达当前点的路径,即走法

def BFS(mat,start,end):
    M = len(mat)
    N = len(mat[0])
    visited = [[False for j in range(N)] for i in range(M)]  #表示每个点是否已经走过
    visited[start.x][start.y] = True   #将起点处置为走过

    que = deque([start])  #用队列保存要处理的点
    while(que):
        now = que.popleft()  #每次处理队首
        if now.x == end.x and now.y == end.y:  #到达终点,循环结束
            print(now.path)
            return now.deep
        for i,dir in enumerate(dirs):  #尝试往四个方向走
            next = Node(now.x+dir[0],now.y+dir[1],now.deep+1,now.path+[arrows[i]])  #选定一个方向,算出该点,深度加一,路径加一
            if next.x < 0 or next.x >= M or next.y < 0 or next.y >= N or mat[next.x][next.y]==1:  #出范围或不能走时continue
                continue
            if not visited[next.x][next.y]:  #该方向未访问过
                visited[next.x][next.y]=True  #标记为访问
                que.append(next)  #将该点入队,等待后续向这条路径继续前进
    return -1



mat = [[0,1,0,0,1],
       [1,0,0,1,1],
       [0,0,1,1,0],
       [1,0,0,0,1]]
start = Node(0,0,0,[])
end = Node(1,1,0,[])
print(BFS(mat,start,end))