Algorithm 无炸弹最小路径

Algorithm 无炸弹最小路径,algorithm,data-structures,graph,shortest-path,Algorithm,Data Structures,Graph,Shortest Path,给出了尺寸为nxm的二维矩阵。每个单元格中的数据表示穿过单元格的时间。某些块包含表示炸弹的负值。我们需要找到从[0,0]到达[n-1,m-1]而不通过任何炸弹的最短时间 我需要在这里做BFS还是在这里做Dijkstra?如果我做BFS,它如何确定最短时间/最短时间 如果我做Dijkstra,我如何得到从[0,0]单元到[n-1,m-1]的路径 示例矩阵: {0, 4, -1, -1, -1, -1, -1, 8, -1},

给出了尺寸为nxm的二维矩阵。每个单元格中的数据表示穿过单元格的时间。某些块包含表示炸弹的负值。我们需要找到从[0,0]到达[n-1,m-1]而不通过任何炸弹的最短时间

  • 我需要在这里做BFS还是在这里做Dijkstra?如果我做BFS,它如何确定最短时间/最短时间
  • 如果我做Dijkstra,我如何得到从[0,0]单元到[n-1,m-1]的路径
示例矩阵:

                        {0, 4, -1, -1, -1, -1, -1, 8, -1},
                        {4, 0, 8, -1, -1, -1, -1, 11, -1},
                        {-1, 8, 0, 7, -1, 4, -1, -1, 2},
                        {-1, -1, 7, 0, 9, 14, -1, -1, -1},
                        {-1, -1, -1, 9, 0, 10, -1, -1, 1},
                        {-1, -1, 4, -1, 10, 0, 2, -1, -1},
                        {-1, -1, -1, 14, -1, 2, 0, 1, 6},
                        {8, 11, -1, -1, -1, -1, 1, 0, 7},
                        {-1, -1, 2, -1, -1, -1, 6, 7, 0}

如果2D矩阵作为一个图,那么遍历每条边的代价是相同的。在这种情况下,Djikstra的相当于BFS。由于每个细胞的杂交成本不同,Djikstra在这里并不等同于BFS。BFS将确定交叉所需的最小细胞数,但不是最短时间。因此,该要求是Djiksta的要求。这回答了您的第一个问题


我假设你知道如何实现Djikstra的。你们面临的问题是如何在这个问题上实施它。为此,需要将2D矩阵表示为图形。出现的主要问题是如何在图中捕捉节点值之间的关系。这可能是因为您习惯于考虑边上的权重,而不是顶点上的权重。然而,您可以简单地将问题简化为Djikstra的问题,方法是使其成为一个有向图,其中从
[i][k]
[j][k]
的边成本作为
[j][k]
的值,而向后方向的边成本作为
[i][k]
的值。要结合炸弹的概念,只需不为这些单元生成顶点即可。在此之后,应用Djikstra应该是简单的

从2D网格创建一个图形(每个位置都是一个节点,边缘位于上方、下方、右侧和左侧。炸弹位置不进去),但完成初始创建后,请使用步骤2:

假设节点
(x,y)
的值为8,可以从四个节点访问它(在网格中:一个位于上方、右侧、左侧和下方)。将节点转换为4个节点-每个节点相邻一个节点,这四个节点之间通过值为8的边相互连接(团)


在所有图形上完成此操作后,运行Dijkstra…

BFS将找到访问的单元格数最少的路径,但这可能与最短的总遍历时间非常不同。此矩阵是否为邻接矩阵,或者它代表一个网格,相邻单元之间有隐含的连接?它只是一个矩阵,其值表示该单元的成本。更清楚的是,成本与进入该单元有关?它是一个矩阵,其值表示通过该单元的成本。因此,源可以是任意[i,j]而不是[0,0],目的地可以是任意[i,j]而不是[n-1,m-1]。一般来说,我需要从任何来源[a,b]到目的地[c,d]的最短成本路径(这里是时间)。你的答案不清楚。我需要最小成本路径,也就是从(0,0)到(n-1,m-1)的最短(时间)路径。要考虑路径的成本。我根本不考虑拍拍的长度。若它是一张图表,我就不会问这个问题了。它是一个矩阵,其值表示传递该单元格的成本。因此,源可以是任意[i,j]而不是[0,0],目的地可以是任意[i,j]而不是[n-1,m-1]。@kosre i误读了这个问题。我现在已经编辑了答案。如果它符合你的要求,请告诉我queries@kosre这就是我在回答中试图解决的问题。将每个单元定义为顶点。答案中解释了哪些顶点将具有边以及边的代价。在这之后,你会有一个图表。现在你可以在图上应用Djikstra。在这其中的哪一部分,你有问题吗?@therainmaker-为了避免溢出,根本不为炸弹单元生成顶点。