矩阵或网格中两个单元之间的最短距离2025年03月17日 | 阅读 9 分钟 在矩阵或网格中两个单元格之间的最短距离问题是一项经典的算法挑战,在机器人技术、导航系统和计算机游戏等领域有着广泛的应用。 给定一个矩阵或网格,其中每个单元格可能代表不同的状态或障碍,目标是确定两个指定单元格之间的最短路径。通常,允许的移动仅限于相邻单元格之间的上、下、左、右方向。 一种用于解决此问题的方法是广度优先搜索(BFS)。BFS 按单元格逐个探索网格,从源单元格开始,标记已访问的单元格,直到到达目标单元格。首次遇到目标单元格时,算法终止,并计算距离。 BFS 算法的流程
执行 BFS 需要维护一个队列来管理探索顺序,以及一个访问数组来跟踪已访问过的单元格。 该算法通过系统地探索网格,有效地保证了矩阵中两个单元格之间的最短距离。 算法。使用广度优先搜索 (BFS) 在矩阵或网格中查找两个单元格之间最短距离的算法可概述如下:
如果队列变空但仍未到达目标单元格,则目标不可达。返回一个适当的值(例如 -1)。 广度优先搜索算法确保了最短路径的建立,因为它以层级的方式探索网格,这意味着较短的路径会比较长的路径优先考虑。 实施输出 上述代码的输出如下: ![]() 说明 此 Python 代码的目的是查找给定矩阵或网格中两个单元格('s' 表示源,'d' 表示目标)之间的最短距离。该算法使用广度优先搜索 (BFS) 完全搜索矩阵,并使用 QUEItem 类来表示当前位置和到源的距离。 QUEItem 类。 定义 QUEItem 类以存储有关矩阵单元格的信息。它包含属性 row、col 和 dist,分别表示行和列索引以及到源的距离。repr 方法用于为类实例提供用户友好的描述。 minimumdist 函数。 1. 源 过程从根据矩阵中的字母 's' 初始化源单元格开始。 2. 启动和 BFS 创建一个二维数组来控制待处理的单元格。 队列从源单元格开始。 如果队列不为空,则开始 BFS 过程;单元格被移除,并探索它们的邻居。 3. 单元格发现 该函数允许四种可能的移动:上、下、左、右。 如果移动是有效的(在矩阵边界内,未被“0”阻挡,且未被访问过),则将代表邻居的新 QUEItem 入队。 4. 找到目标位置 如果在搜索中找到目标单元格('d'),则返回从源到目标的路径。 5. isValid 函数 isValid 函数检查到给定单元格的路径是否有效。这确保了索引在矩阵边界内,单元格未被“0”阻挡,并且单元格未被访问过。 6. 特殊部分 主部分定义了示例网格并调用 minimuDist。 讨论 该算法通过 BFS 完全搜索矩阵,从源单元格开始。它使用队列来跟踪搜索顺序,并使用访问数组来标记待处理的单元格。BFS 过程一直持续到到达目标单元格并计算出距离。isValid 函数确保在搜索中只考虑有效的路径。 示例网格 示例网格是一个 4x4 矩阵,其中 's' 代表源单元格,'d' 代表目标单元格,'*' 代表自由单元格,'0' 代表障碍单元格。该算法将找到并打印源和目标单元格之间的最短距离。 此代码演示了 BFS 在矩阵中查找最短路径的有效应用,包括绕过障碍并找到两个指定单元格之间的最佳路径的能力。 方法 2使用 Python collections 包中的 deque 库实现上述程序的代码 输出 ![]() 说明 上面的 Python 代码定义了一个名为 sdist 的函数,该函数使用广度优先搜索 (BFS) 系统在给定矩阵中计算两点之间的最短距离。该函数接受三个参数:mat(表示网格的二维矩阵)、begin(表示起始坐标的元组)和 end(表示目标点的元组)。 该函数初始化变量来存储矩阵中的行数和列数(row 和 col),一个二维布尔数组来跟踪已访问的单元格(visited),以及一个包含起始位置及其初始距离(零)的 deque(队列)。 算法的核心是一个 BFS 循环,它迭代地探索矩阵中的单元格。每个新迭代都会出队一个单元格(currCell)及其距离(dist)。如果当前单元格是目标点,则该函数立即返回已走过的距离,表明已找到最短路径。 该函数还探索上、下、左、右四个方向的相邻单元格。它评估每个邻居是否在矩阵边界内并且之前未被访问过。如果满足这些条件,则将邻居标记为已访问,并将其邻居(以及更新后的距离)一起入队以进行进一步探索。 如果循环完成但未找到目标点,则该函数返回 1,表示在起始点和终点之间可能不存在有效路径。 总之,sdist 函数采用 BFS 来查找给定矩阵中起始点和目标点之间路径数量上的最短距离。它使用队列来控制探索顺序,并使用访问矩阵来避免重复访问单元格。如果找到有效路径,该函数返回最短距离,否则返回 -1。 复杂度 时间复杂度 BFS 算法的时间复杂度通常用图中节点和边的数量来表示,或者在这种情况下,用网格表示。让我们用 R 表示行数,用 C 表示列数。在最坏的情况下,BFS 算法可以识别矩阵中的所有单元格。对于每个单元格,该函数会查找其邻居,因此每个单元格的处理时间都是常数。 因此,sdist 函数的总时间复杂度为 O(R * C),其中 R 是矩阵的行数,C 是矩阵的列数。 空间复杂度 BFS 算法中存储信息的 the data structure 影响着空间复杂度。在实现中,布尔矩阵 vis 用于标记待处理的单元格,deque(队列)用于控制搜索顺序。 1. 访问矩阵 (vis) 布尔矩阵 vis 的大小为 R x C,代表整个矩阵。因此,输入矩阵的复杂空间为 O (R * C)。 2. 队列 (queue) 在最坏的情况下,队列可以包含矩阵中的所有单元格。因此,队列的空间复杂度也为 O(R * C)。 这两个功能之间的主要区别在于布尔矩阵所需的空间;因此,sdist 函数的总空间复杂度为 O(R * C)。 总而言之,时间复杂度为 O(R * C),空间复杂度为 O(R * C),其中 R 是矩阵的行数,C 是矩阵的列数。 结论总之,在矩阵或网格中确定两个单元格之间最短距离的问题是一项基础的算法挑战,具有广泛的实际应用。关键在于找到从源单元格到指定目标单元格的最有效路径,同时考虑可能的障碍或被封锁的单元格。 广度优先搜索 (BFS) 算法作为一种流行且有效的解决方案脱颖而出。它从源单元格开始,向外扩展,搜索路径。通过使用队列来控制单元格搜索,并使用访问系统来跟踪已访问过的单元格,BFS 确保了最短路径的建立。 解决此问题的基本步骤包括初始化数据结构、将源单元格入队、执行 BFS 搜索、检查目标单元格和计算距离。这些步骤通常伴随一个验证步骤,以确保移动符合矩阵约束和任何指定的限制。 因此,此问题在机器人技术、导航系统、计算机游戏和控制系统中都有应用。准确确定矩阵中两点之间的最短距离对于优化效率和做出空间决策至关重要。 提供的 Python 代码示例用于演示 BFS 算法在解决最短路径问题中的应用。此示例强调了系统分析、适当的数据结构和仔细验证对于准确性和效率的重要性。 下一主题数组波形排序 |
我们请求您订阅我们的新闻通讯以获取最新更新。