矩阵中带有障碍物和作弊路径的最短路径

2024-02-13

首先,这是一项作业,我不是在寻找直接答案,而是在寻找您可能想到的最佳解决方案的复杂性。

这是矩阵中两点(起点和终点)之间有障碍物时的最短路径的已知问题。可接受的移动方式为上、下、左、右。假设在移动时我携带某物,每次移动的成本是 2 。矩阵中有一些点(让它们命名为 B 点),我可以将这个东西留在一个 B 点中,然后从另一个 B 点中拾取它。在 B 点倾倒某物的成本为 1,从 B 点再次拾取某物的成本为 1。每当我在没有这个东西的情况下移动时,我现在的移动成本是 1 。 我认为的解决方案是将矩阵转换为树并应用 BFS。然而,这在没有 B 点的情况下也有效。

每当我考虑 B 点复杂性时,最坏的情况就是 N^2。 这是一个例子:

S - - -
- - - -
B - - B
- - O E

S = 开始,E = 结束,B = B 点掉落某物,O = 障碍物 所以我从S开始,向下移动到B点(2*2=4点),将某物留在B点(1点),向右移动(2*1=2点),拿起它(1点),向下移动 2 分 = 总共 10 分。

我的想法是用每个 B 点的节点构建树,但这将创建一个几乎 (V-1)*(V-1) 边的非常密集的循环图,该图在 N^2 边界中采用算法只是为了创建图。 这是最坏的情况,如上所述:

S b b b
b b b b
b b b b 
b b b E

我想到的另一个选择是首先计算没有 B 点的最短路径。 然后进行迭代,每次迭代: 首先在 S 和最近的 B 上有 bfs 在 E 和最近的 B 上有 BFS 然后查看最接近 S 的 B 和最接近 E 的 B 之间是否存在路径。 如果有,那么我会看看该路径是否小于有障碍的常规最短路径。 如果更大,则不存在最短路径(不进行贪心测试)。 如果 2 个 B 点之间没有路径,请尝试距离 S 第二近的点,然后重试。 如果再次没有路径,则第二个最接近 E 且最接近 S 的路径。 然而,我无法计算最坏情况下的复杂性,而且没有贪婪测试来评估这一点。 任何有关计算复杂性甚至指出最佳复杂性解决方案(不是解决方案而只是复杂性)的帮助将不胜感激


您的矩阵是图形的表示。没有作弊路径,实现一个好的 BFS 是很容易的。实施作弊路径并不是什么大问题。只需在第一个“层”之上添加与另一个“层”相同的矩阵即可。底层是“携带”,顶层是“不携带”。您只能在 B 点以给定的成本移动到另一层。这与第三维的 BFS 相同。

每层有 n^2 个节点和 (n-1)^2 条边,此外还有最多 n^2 个连接各层的边。那是 O(n^2)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

矩阵中带有障碍物和作弊路径的最短路径 的相关文章

  • 确定解决迷宫问题的最小线段数

    我有一个问题 我需要定义一个具有最少数量的顶点的多边形 该多边形与不透明的图像中的每个像素相交或包含每个像素 令 N 为图像中的像素数 我唯一的假设是图像的边界 孔 内不能包含透明像素 并且至少有两个像素是不透明的 举个例子 假设我有以下图
  • 检索受“rowspan”影响的行的列索引的最有效方法是什么?

    考虑下表 table thead tr th th th A th th B th th C th tr thead tbody tr th 1 th td Apples td td Oranges td td Pears td tr tb
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • 图中的后边

    I m having a hard time understanding Tarjan s algorithm for articulation points I m currently following this tutorial he
  • 固定大小集以包含给定集的最大数量

    我有大约 1000 组尺寸 1 4 1 3 3 5 6 4 5 6 7 5 25 42 67 100 是否有可能找到包含最大数量的给定集合的大小为 20 的集合 检查每一个100 80 20 集 效率低下 我不太确定这是 NP 完全的 考虑
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包
  • 有人可以解释以下异或属性

    我的一个论坛提到给定的数组n数字 arr 0 n 1 以下条件成立 is the xor运算符 f l r f 0 r f 0 l 1 where f l r arr l arr l 1 arr r 我检查了上面的数组数量和不同的值l an
  • 标签中的路径显示

    NET 中有没有自动修剪路径字符串的方法 例如 C Documents and Settings nick My Documents Tests demo data demo data emx becomes C Documents dem
  • 如何在 Windows 10 中将文件夹添加到“Path”环境变量(带有屏幕截图)

    在 StackOverflow 和整个网络上 关于如何将特定文件夹添加到 Windows 10 的指南已经过时且很少Path用户的环境变量 我认为针对新开发人员的完整指南 包含分步说明和屏幕截图 对于帮助他们从命令提示符 https upl
  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何
  • 使用 Ansible 将二进制文件添加到 PATH

    我正在尝试安装Kiex https github com taylor kiex版本管理器Elixir http elixir lang org install html使用 Ansible 的编程语言 这些是我为此使用的戏剧 name K
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • 无法在 Windows 10 上更新 pip 的 PATH 变量

    我知道有数千个类似的主题 但我的 pip 命令突然停止工作 尽管我进行了所有研究 但我无法弄清楚原因 自从我上次使用 pip 以来已经有一段时间了 令人惊讶的是我的计算机不再识别该命令 我重新安装了pip 提示告诉我PATH变量没有正确更新
  • 如何在 Jenkins 声明式管道中设置 PATH

    在 Jenkins 脚本化管道中 您可以像这样设置 PATH 环境变量 node git url https github com jglick simple maven project with tests git withEnv PAT
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 将构建参数传递给 .wxs 文件以动态构建 wix 安装程序

    我是一名学生开发人员 我已经为我现在工作的公司构建了几个安装程序 所以我对WIX还是比较熟悉的 我们最近决定拥有一个构建服务器来自动构建我们的解决方案 它构建调试和发布以及混淆 和非混淆 项目 你真的不需要理解这些 您需要了解的是 我有相同
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32

随机推荐