首先,这是一个评估,我不是在寻找直接的答案,而是在寻找最佳解决方案的复杂性,正如您所想的那样。
这是矩阵中两个点(起点和终点)之间的最短路径的已知问题,同时有障碍物。移动可接受的是上、下、左和右。假设移动时 i 携带某物,每次移动的成本为 2 。矩阵中有一些点(我们将它们命名为 B 点),我可以将它留在一个 B 点中,然后从另一个 B 点拾取它。在 B 点倾倒某物的成本是 1,从 B 点重新捡起某物的成本是 1。每当我没有这个东西搬家时,我现在搬家的成本是1。我认为解决方案是将矩阵转换为树并应用 BFS。然而,这在没有 B 点的情况下有效。
每当我考虑到 B 点复杂性时,就会出现最坏的情况 N^2。这是一个例子:
S - - -
- - - -
B - - B
- - O E
S = Start , E = End , B = B point to drop sth, O = 障碍 所以我从 S 开始向下移动到 B 点 (2*2=4 点) 离开 sth 在 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 上有 bfs,在最近的 B 在 E 和最近的 B 上有 BFS 然后看看在最接近 S 的 B 和最接近 E 的 B 之间是否有路径。如果有,那么我会看看路径是否小于有障碍物的常规最短路径。如果它更大,那么就没有最短路径(没有贪心测试)。如果 2 个 B 点之间没有路径,请尝试第二个最接近 S 的点,然后重试。如果再没有路径,第二个最接近E,最接近S。但是,在最坏的情况下,我无法计算这一复杂性,而且没有贪婪的测试来评估它。