首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

BFS使用2个队列寻找2维矩阵的最短路径

广度优先搜索(Breadth-First Search,简称BFS)是一种用于遍历或搜索树或图的算法。在寻找二维矩阵的最短路径问题中,BFS通过逐层扩展节点来找到从起点到终点的最短路径。使用两个队列的BFS算法可以有效地处理这个问题。

基础概念

  1. 队列:一种先进先出(FIFO)的数据结构。
  2. BFS:从根节点开始,逐层遍历每个节点的所有邻居节点,直到找到目标节点。

优势

  • 简单直观:算法逻辑清晰,易于理解和实现。
  • 保证最短路径:在无权图中,BFS能够保证找到的路径是最短的。

类型

  • 单队列BFS:使用一个队列来存储待访问的节点。
  • 双队列BFS:使用两个队列来优化某些特定情况下的性能。

应用场景

  • 迷宫问题:在二维矩阵中寻找从起点到终点的最短路径。
  • 社交网络分析:查找两个人之间的最短关系链。
  • 网络路由:确定数据包从源到目的地的最短路径。

示例代码

以下是一个使用两个队列的BFS算法来寻找二维矩阵中最短路径的Python示例:

代码语言:txt
复制
from collections import deque

def shortest_path(matrix, start, end):
    rows, cols = len(matrix), len(matrix[0])
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 右, 下, 左, 上
    
    if start == end:
        return 0
    
    queue1 = deque([start])
    queue2 = deque()
    visited = set([start])
    distance = {start: 0}
    
    while queue1 or queue2:
        while queue1:
            current = queue1.popleft()
            for dx, dy in directions:
                next_x, next_y = current[0] + dx, current[1] + dy
                if (0 <= next_x < rows and 0 <= next_y < cols and
                        matrix[next_x][next_y] != 1 and
                        (next_x, next_y) not in visited):
                    if (next_x, next_y) == end:
                        return distance[current] + 1
                    queue2.append((next_x, next_y))
                    visited.add((next_x, next_y))
                    distance[(next_x, next_y)] = distance[current] + 1
        
        queue1, queue2 = queue2, deque()
    
    return -1  # 如果没有找到路径,返回-1

# 示例矩阵
matrix = [
    [0, 1, 0, 0, 0],
    [0, 1, 0, 1, 0],
    [0, 0, 0, 1, 0],
    [0, 1, 1, 1, 0],
    [0, 0, 0, 0, 0]
]

start = (0, 0)
end = (4, 4)
print("最短路径长度:", shortest_path(matrix, start, end))

可能遇到的问题及解决方法

  1. 死循环:如果矩阵中有环,可能会导致死循环。解决方法是在访问节点时标记已访问节点。
  2. 内存消耗:对于非常大的矩阵,队列可能会占用大量内存。可以通过优化数据结构或分块处理来解决。
  3. 复杂路径:如果矩阵中有多个障碍物,路径可能会变得复杂。可以通过增加更多的方向或使用启发式搜索来优化。

原因分析及解决方案

  • 原因:算法在某些情况下可能会陷入局部最优解。
  • 解决方案:引入启发式函数(如A*算法)来指导搜索方向,避免局部最优。

通过上述方法,可以有效解决二维矩阵中最短路径的问题,并确保算法的效率和准确性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【图论树】算法「DFSBFS」思想,附两道道手撕题

栈(非递归):手动使用栈来模拟递归过程,将待访问的节点入栈,然后出栈访问,继续将下一个节点入栈。 递归:递归函数在到达路径的末端时自动回溯,继续搜索其他路径。...实现方式 BFS通常使用队列来实现,将起始节点入队,然后出队访问,将所有相邻未访问节点入队,直到队列为空。 特点 先进先出:BFS遵循队列的FIFO(先进先出)原则。...全面扩散,逐层递进:BFS会逐层访问所有节点,直到找到目标或遍历完所有节点。 应用场景 BFS适用于需要找到最短路径的问题,例如最短路径问题、社交网络中的影响力传播等。...适用问题:DFS适合于需要遍历所有可能路径的问题,而BFS适合于需要找到最短路径的问题。 实例题 N皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。...().split())) matrix.append(row) result = 0 # 初始化连通块数量 # 遍历矩阵,寻找值为1的节点并进行深度优先搜索 for i in range(rows

15210
  • 【愚公系列】2023年11月 数据结构(十四)-图

    BFS则从某个节点开始,先访问它的所有邻接节点,再按照距离从小到大依次访问它们的邻接节点。最短路径:在图中,最短路径是指从一个节点到另一个节点的最短距离。...☀️1.1.3 无权图和有权图无权图指的是图中每条边都没有权值或权重,只有节点之间的连接关系。在无权图中,寻找最短路径的算法可以使用广度优先搜索(BFS)。...有权图则是指图中每条边都有权值或权重,表示这条边的代价或距离。在有权图中,寻找最短路径的算法可以使用Dijkstra算法或A*算法。...BFS 通常使用队列来实现。首先将遍历起点入队,然后每次从队列中取出一个顶点,访问该顶点,并将该顶点的未访问过的邻居入队。这样直到队列为空,就完成了整个图的遍历。...BFS 可以用来求解最短路径问题,因为它按照距离递增的顺序遍历了所有可达顶点。当找到目标顶点时,所经过的路径即为最短路径。

    26922

    5.3.1图的遍历

    1、BFS算法的性能分析 无论是邻接表还是邻接矩阵的存储方式,BFS算法都需要借助一个辅助队列Q,n个顶点均需入队一次,在最坏的情况下,空间复杂度为O(|v|)。...2.BFS算法求解单源最短路径问题 如果G=(V,E)为非带权图,定义从顶点u到顶点v的最短路径d(u,v)为从u到v的任何路径最短的边数;如果从u到v没有通路,则d(u,v)=无穷。...使用BFS,我们可以求解一个满足上述定义的非带权图的最短路径问题,这是由广度优先搜索总是按距离由近到远来遍历图中每个人顶点的性质决定的。...void BFS_MIN_DISTANCE(Graph G,int u){ //d[i]表示从u到i结点的最短路径 for(i=0;i<G.vexnum;i++) d[i]=...//顶点w入队列 } } } } 3.广度优先生成树 在广度遍历的过程中,我们可以得到一颗遍历树,称为广度遍历生成树,一给定图的邻接矩阵存储表示是唯一的

    48310

    二叉树的最大深度,图

    (有向图) 如果图中每两个顶点间在双向上都存在路径,则该图是强连通的 图还可以是未加权的或是加权的 邻接矩阵 每个节点都和一个整数相关联,该整数将作为数组的索引。...image.png 关联矩阵 使用关联矩阵来表示图 在关联矩阵中,矩阵的行表示顶点,列表示边 关联矩阵用于边的数量比顶点多的情况下,以节省空间和内存 创建Graph类 function...(u); // 会用到它 } } }; 使用BFS寻找最短路径 题:给定一个图G和源顶点v,找出对每个顶点u,u和v之间最短路径的距离(以边的数量计)。...d[u]; 当顶点u被标注为黑色时,u的完成探索时间f[u]; 顶点u的前溯点p[u] 最短路径算法 Dijkstra 算法,是一种计算从单个源到所有其他源的最短路径的贪心算法 题图: ?...前中后属于 DFS,层次遍历属于 BFS DFS 都可以使用栈来简化操作,并且其实树本身是一种递归的数据结构,因此递归和栈对于 DFS 来说是两个关键点 队列 队列中用 Null(一个特殊元素)来划分每层

    62520

    BFS:解决多源最短路问题

    其实我们上次讲的就可以归结在单元最短路问题当中,其实单源最短路问题就是只有一个起点对应一个终点,求最短路径,而多源最短路问题则是多个起点,对应一个终点,求这多个起点到达终点的最短路径,那这种题我们该怎么做呢...这里具体一点就是对这个二维数组最外面的一层用一次多源BFS,先把所有在外面的1入进队列中,然后并标记,表示这个1已经被访问过了,并且不是内部的岛屿,然后再遍历一遍数组,找到没有被标记的1的个数。...算法在解决多源最短路问题中的应用介绍,可以看出BFS在处理无权图的最短路径问题时具有显著优势。...它不仅操作简单、直观易懂,而且其广度优先的特点使得它在寻找最短路径时非常高效。多源最短路问题在实际生活中有着广泛的应用,例如交通网络中的最短路径计算、社交网络中的影响力传播等。...避免重复访问:使用访问标记或距离数组来避免节点被重复处理,提高算法效率。 通过实际案例,我们可以看到BFS在解决多源最短路问题时的高效性和可靠性。

    12510

    【JavaScript 算法】广度优先搜索:层层推进的搜索策略

    三、应用场景 最短路径搜索: 广度优先搜索可以用于在无权图中寻找两个节点之间的最短路径。由于BFS逐层遍历,第一次找到目标节点时,即可保证路径是最短的。...连通性检查: BFS可以用于检查图的连通性,确定图中是否存在路径连接所有节点,并找出所有连通分量。 层次遍历: BFS在树的层次遍历中有重要应用,可以按层次顺序访问树的节点。...求解迷宫问题: 在迷宫问题中,BFS可以用于寻找从起点到终点的最短路径,通过逐层扩展,可以找到最短路径解。...(graph, 'A'); 双向广度优先搜索: 对于某些特殊场景,可以使用双向广度优先搜索,同时从起点和终点开始进行BFS,直到两边相遇,从而减少搜索空间,提高效率。...广度优先搜索算法实现简单,适用于最短路径搜索、连通性检查、层次遍历和求解迷宫问题等应用场景。

    27910

    【C++笔试强训】如何成为算法糕手Day7

    岛屿数量 - 力扣(LeetCode) 思路: 深度优先遍历DFS 目标是找到矩阵中 “岛屿的数量” ,上下左右相连的 1 都被认为是连续岛屿。...dfs方法: 设目前指针指向一个岛屿中的某一点 (i, j),寻找包括此点的岛屿边界。...bfs 方法: 借助一个队列queue,判断队列首部节点(i, j)是否未越界而且为1 如果是则置(删除此岛屿),并将此节点上下左右节点(i+1,j),(i-1,j),(i,j+1)...if (parent[idx] == idx) return idx; // 路径压缩,只要idx节点的父节点不是整个集合的头节点,那么就把路径上每个节点都向集合的头结点...注意,是最短边,如果是任意两条边,那样会加大我们的工作量的。 但贪心的点就在于,要是连两条最短边相加,都大于第三边了,那其他任意两边之和,一定也会大于第三边的。

    9610

    (含DFS、BFS)

    前言 本文主要讲解 数据结构中的图 结构,包括 深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树算法等,希望你们会喜欢。 目录 1....图的存储结构 = 邻接矩阵 / 邻接表 的性能对比 5.3.2 广度优先遍历(BFS) 简介 image.png 算法示意图 具体流程 注:G 比 I 先访问的原因 = 用数组存储顶点时,G...return; // 将邻接矩阵的第i行第j列的元素值置为1; arcs[i][j] = 1; // 将邻接矩阵的第j行第i列的元素值置为1;...最短路径 7.1 定义 对于非网图(无权值),最短路径 = 两顶点间经过的边数最少的路径 对于网图(有权值):最短路径 = 两顶点间经过的边上权值和最少的路径 第1个顶点 = 源点、第2个顶点 = 终点...7.2 需解决的问题 从源点 -> 其余各顶点的最短路径 7.3 寻找最短路径 算法 主要包括:迪杰斯特拉算法(Dijkstra)、弗洛伊德算法(Floyd) 具体介绍如下 8.

    28930

    (含DFS、BFS)

    if (i == j) return; // 将邻接矩阵的第i行第j列的元素值置为1; arcs[i][j] = 1; // 将邻接矩阵的第...图的存储结构 = 邻接矩阵 / 邻接表 的性能对比 image.png 5.3.2 广度优先遍历(BFS) 简介 image.png 算法示意图 image.png 具体流程 image.png...return; // 将邻接矩阵的第i行第j列的元素值置为1; arcs[i][j] = 1; // 将邻接矩阵的第j行第i列的元素值置为1;...最短路径 7.1 定义 对于非网图(无权值),最短路径 = 两顶点间经过的边数最少的路径 对于网图(有权值):最短路径 = 两顶点间经过的边上权值和最少的路径 第1个顶点 = 源点、第2个顶点 = 终点...7.2 需解决的问题 从源点 -> 其余各顶点的最短路径 7.3 寻找最短路径 算法 主要包括:迪杰斯特拉算法(Dijkstra)、弗洛伊德算法(Floyd) 具体介绍如下 image.png

    1K20

    【JavaScript 算法】图的遍历:理解图的结构

    广度优先搜索的步骤 从起始节点开始,将其标记为已访问,并加入队列。 当队列不为空时,取出队列的头节点,访问该节点的所有相邻节点。 对于每个相邻节点,如果未被访问过,将其标记为已访问并加入队列。...:DFS和BFS都可以用于寻找图中的路径。...连通性检查:通过DFS或BFS,可以检查图的连通性,确定图中是否存在路径连接所有节点。 最短路径搜索:BFS适用于在无权图中寻找两个节点之间的最短路径。...拓扑排序:在有向无环图(DAG)中,可以使用DFS进行拓扑排序。 环路检测:通过DFS可以检测图中是否存在环路。 四、总结 图的遍历是理解图结构和解决图论问题的重要工具。...通过理解和掌握这两种遍历方法,可以解决许多实际问题,如路径搜索、连通性检查、最短路径搜索、拓扑排序和环路检测等。

    29110

    动画演示广度优先算法寻找最短路径

    BFS 算法与 DFS 十分相似,唯一的区别就是 DFS 算法使用后进先出的栈来保存节点,而 BFS 算法使用先进先出的队列来存储节点,除此之外简直就是一母同胞的亲兄弟。当然,这两种方案各有千秋。...DFS 算法找到的路径往往不是最短路径,速度慢但占用内存较少,而 BFS 算法找到的总是最短路径,速度较快但占用内存较多。 下图是使用 BFS 算法搜寻出来的一条路径: ?...使用广度优先算法搜寻迷宫路径的过程如下:从迷宫入口出发,查询下一步走得通的节点,将这些可能的节点压入队列中,已经走过的节点不再尝试。...而广度优先搜索每次前进的时候,会把前后左右行得通的节点都尝试一遍,相当于每前进一个节点都要尝试多种可能,因此每次挑选的路径会是最短路径。...BFS 算法寻找迷宫路径,并对搜寻到的迷宫路径进行可视化演示。

    2.1K20

    【数据结构与算法】图最短路径算法 ( Floyed 算法 | 图最短路径算法使用场景 | 求解图中任意两个点之间的最短路径 | 邻接矩阵存储图数据 | 弗洛伊德算法总结 )

    文章目录 一、最短路径 二、图最短路径算法使用场景 三、求解图中任意两个点之间的最短路径 四、邻接矩阵存储图数据 五、只允许经过 1 号点中转得到任意两点之间的最短路径 六、在之前的基础上-只允许经过...: 权值累加总和为 8 ; C4 -> C3 -> C5 -> C6 : 权值累加总和为 8 ; 其它的路径更远 , 可以看到其最短路径是 后两种 , 最短路径为 8 ; 二、图最短路径算法使用场景 -...--- 图最短路径算法使用场景 : 管道铺设 线路安装 地图规划 三、求解图中任意两个点之间的最短路径 ---- 假设图中有任意两个点 , A 点 和 B 点 , 要令 A 到 B 之间的 距离 变短...之间的距离 ; 四、邻接矩阵存储图数据 ---- 使用 邻接矩阵 存储 下图信息 ; 下图中 使用 二维数组 int[][] edge 存储邻接矩阵 , 二维数组 元素的值为 两个点 之间的 边 的...---- 在上述 邻接矩阵 int[][] edge 中 , 求 结点 i 到 结点 j 之间的 最短路径 , 并且只允许从 结点 1 进行中转 ; 结点 i 到 结点 j 的距离为 edge[i][

    2.4K20

    我写了一个模板,把 Dijkstra 算法变成了默写题

    再加上 BFS 算法利用for循环一层一层向外扩散的逻辑和visited集合防止走回头路的逻辑,当你每次从队列中拿出节点cur的时候,从start到cur的最短权重就是step记录的步数。...因为两个节点之间的最短距离(路径权重)肯定是一个确定的值,不可能无限减小下去,所以队列一定会空,队列空了之后,distTo数组中记录的就是从start到其他节点的最短距离。...Dijkstra 算法使用优先级队列,主要是为了效率上的优化,类似一种贪心算法的思路。...比如本文实现的 Dijkstra 算法,使用了 Java 的PriorityQueue这个数据结构,这个容器类底层使用二叉堆实现,但没有提供通过索引操作队列中元素的 API,所以队列中会有重复的节点,最多可能有...明白这一点,再想一下使用 Dijkstra 算法的前提,加权有向图,没有负权重边,求最短路径,OK,可以使用,咱们来套框架。

    1.5K10

    【BFS最短路问题】迷宫中离入口最近的出口

    迷宫中离入口最近的出口 1926. 迷宫中离入口最近的出口 ​ 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 '.' 表示)和墙(用 '+' 表示)。...请你返回从 entrance 到最近出口的最短路径的 步数 ,如果不存在这样的路径,请你返回 -1 。...解题思路:广度优先遍历 ​ 其实这类最短路径问题,和前面的 floodfill 算法问题是差不多的,大体代码框架还是那样子! ​...所以我们可以用一个变量 step 记录下路径长度,从起点做一个广度优先遍历,将其临近的并且符合要求的节点添加到队列中,此时判断一下如果这些节点中如果就是边界节点的话,则直接返回 step,如果不是的话则继续做广度优先遍历...然后在 bfs 途中和 floodfill 算法不同的是,我们要将每一层队列中的节点拎出来做 bfs,也就是每一层队列有 size 个,则对这层做 size 次 bfs,而不是不停的做 bfs,因为我们要控制一层一层往外走

    8110

    数据结构与算法—深度、宽度优先(dfs,bfs)搜索

    并且一般来说图的更大需要设计算法的优化,所以这里例子使用邻接矩阵完成!...(open-closed表) 简单来说,bfs就是先进先出的队列遍历,然而这样在分布的情况就是按层遍历,可以参考二叉树遍历的层序遍历! 如果从路径上走来看,dfs就是一条跑的很快的疯狗,到处乱咬。...所以在爬虫可以用于遍历网站,搜寻整个网站的价值信息等等,笔者以前用爬虫+bfs实现过下载网站的模板(17素材的网页模板)。而在算法中,在迷宫或者无权图中,bfs可以找到最短路径。...并且在bfs还有变种的A*等高级算法。并且bfs经常和优先队列在一起搜索部分有其他规则的目的地。 ? 在上面可以看得出在邻接矩阵实现储存上浪费很多空间,但有些情况使用二维数组很合适——迷宫类问题。...我们在面试学习,会经常遇到迷宫类需要bfs找最短路径,或者dfs查询是否存在。或者双bfs又或者dfs+bfs等等解决具体问题。 最后,希望大家能关注我,我们一起学习数据结构与算法!

    1.2K10

    数据结构之图

    1.3 图的表示方法 图可以通过多种方式来表示,其中两种常见的方法是邻接矩阵和邻接表。 邻接矩阵: 使用二维数组表示节点之间的连接关系,适用于稠密图。...以下是BFS的基本步骤: 选择一个起始节点,将其标记为已访问并加入队列。 从队列中取出一个节点,访问其未访问邻居节点,并将其加入队列。 重复步骤2,直到队列为空。...BFS常用于解决最短路径问题,例如查找两个节点之间的最短路径。 第三部分:最短路径算法 在图的世界中,寻找最短路径是一项常见而重要的任务。...3.1 Dijkstra算法 Dijkstra算法是解决单源最短路径问题的经典算法,适用于没有负权边的图。算法的基本思想是通过贪心策略逐步确定起始节点到其他节点的最短路径。...3.2 Bellman-Ford算法 Bellman-Ford算法是一种更为通用的最短路径算法,适用于图中存在负权边的情况。算法采用动态规划的思想,通过不断更新节点的最短路径估计来求解。

    16700

    Python 算法基础篇:深度优先搜索( DFS )和广度优先搜索( BFS )

    BFS 使用队列来记录遍历的路径,它优先访问最早添加到队列的节点。 BFS 的主要优点是能够找到起始节点到目标节点的最短路径,因为它是逐层遍历的。 4....DFS 与 BFS 的对比 DFS 和 BFS 是两种不同的图遍历算法,在不同的应用场景下具有不同的优势: DFS 适用于找到起始节点到目标节点的路径,但不一定是最短路径。...它通过递归的方式深入探索图的分支,因此对于深度较小的图或树, DFS 通常表现较好。 BFS 适用于找到起始节点到目标节点的最短路径。它通过逐层遍历图的节点,从而保证找到的路径是最短的。...在需要寻找最短路径的情况下, BFS 是更好的选择。...DFS 是一种深入探索图或树的算法,通过递归方式遍历每个节点,优先访问最近添加到栈的节点。 BFS 是一种逐层遍历图或树的算法,通过队列来存储遍历路径,优先访问最早添加到队列的节点。

    2.9K50

    【愚公系列】软考中级-软件设计师 020-数据结构(图)

    图具有很多重要的算法,比如深度优先搜索(DFS)和广度优先搜索(BFS)用于遍历图,最短路径算法用于找到两个节点之间的最短路径,拓扑排序用于解决依赖关系问题等等。...在使用邻接矩阵存储图时,需要考虑到数组的大小限制和边的存储方式。通常可以使用二维数组、动态数组或稀疏矩阵等数据结构来实现邻接矩阵的存储。...2、广度优先搜索(BFS):BFS使用队列来实现。它从图的某个节点开始,首先将该节点入队列,然后访问该节点的所有邻接节点,并将其入队列。...接下来,从队列中取出一个节点并访问它的所有邻接节点,将它们入队列。重复这个过程,直到队列为空。DFS和BFS都可以用来遍历无向图和有向图。...拓扑序列可能不是唯一的,一个图可以有多个拓扑序列。可以使用深度优先搜索(DFS)或广度优先搜索(BFS)等算法来生成拓扑序列。

    28021

    数据结构与算法——BFS(广度优先搜索)

    BFS算法使用队列来辅助实现,将起始节点放入队列中,然后依次取出队列中的节点,访问其相邻节点,并将其加入队列。这样可以保证从起始节点出发,依次按照距离顺序遍历节点。...BFS常用于寻找最短路径,因为它按照从起点到每个节点的距离来探索节点。 在ACM、蓝桥杯等著名竞赛中BFS算法是比较重要的,特别是在蓝桥杯中每一年几乎都要考DFS/BFS算法。...基本步骤: BFS算法通常使用队列来实现,BFS算法的具体步骤如下: 创建一个队列,将起始节点加入队列; 创建一个集合,用于存储已经访问过的节点; 从队列中取出一个节点,并将其标记为已访问; 访问该节点的所有相邻节点...BFS算法可以用来解决一些问题,例如图的遍历、最短路径搜索等。由于BFS算法保证了按照距离顺序遍历节点,因此可以用来寻找最短路径。...【输入】 第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n(1≤n≤ 100),表示迷宫的规模是n×n的。接下来是一个n×n的矩阵,矩阵中的元素为.或者#。

    30410
    领券