【问题标题】:Shortest path in a grid using BFS使用 BFS 的网格中的最短路径
【发布时间】:2019-03-23 17:55:42
【问题描述】:

网格由以下项目组成,如 python 列表列表

g = [
    ['1', '1', '1', '1', '1'],
    ['S', '1', 'X', '1', '1'],
    ['1', '1', '1', '1', '1'],
    ['X', '1', '1', 'E', '1'],
    ['1', '1', '1', '1', 'X']
]

S表示开始,E表示结束。

1 表示允许的路径,X 表示不允许的路径

一个简单的BFS遍历代码是

def find_path_bfs(s, e, grid):
    queue = list()
    path = list()
    queue.append(s)

    while len(queue) > 0:
        node = queue.pop(0)
        path.append(node)
        mark_visited(node, v)

        if node == e:
            break

        adj_nodes = get_neighbors(node, grid)
        for item in adj_nodes:
            if is_visited(item, v) is False:
                queue.append(item)

    return path

据我所知,该算法使用以下输出正确遍历

[(1, 0), (1, 1), (2, 0), (0, 0), (2, 1), (0, 1), (2, 1), (0, 1), (2, 2), (3, 1), (0, 2), (2, 2), (3, 1), (0, 2), (2, 3), (3, 2), (3, 2), (4, 1), (0, 3), (2, 3), (3, 2), (3, 2), (4, 1), (0, 3), (2, 4), (3, 3)]

列表中的每个元组代表原始图中节点的索引。

如何重写我的 BFS 代码以返回最短路径而不是到达目标节点所遵循的整个遍历路径?我已经花了几个小时自己寻找答案,但到目前为止我一直不成功。

【问题讨论】:

    标签: python graph shortest-path breadth-first-search


    【解决方案1】:

    为了获得最短路径,您也应该将路径保存到队列中的当前节点,因此队列项目的格式为:

    (node, path_to_this_node)
    

    修改代码:

    def find_path_bfs(s, e, grid):
        queue = [(s, [])]  # start point, empty path
    
        while len(queue) > 0:
            node, path = queue.pop(0)
            path.append(node)
            mark_visited(node, v)
    
            if node == e:
                return path
    
            adj_nodes = get_neighbors(node, grid)
            for item in adj_nodes:
                if not is_visited(item, v):
                    queue.append((item, path[:]))
    
        return None  # no path found
    

    【讨论】:

    • 我仍在尝试了解您的解决方案以及它是如何解决问题的,但它确实优雅地解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多