Path 给定迷宫中的第k条最短路径c++;

Path 给定迷宫中的第k条最短路径c++;,path,shortest,Path,Shortest,给出了一个维数为m×n的代价矩阵。问题是从中找出最小路径 矩阵中某个单元格的左上角。路径的总成本是该路径中访问的所有单元格的总成本。只允许两次移动:向下移动一行,或向右移动一列。你在任何时候都不能离开矩阵,有些细胞被标记为障碍物,不能被踩到。 应回答以下形式的几个问题:tx ty k。此查询的输出应为kth 从左上角到tx行ty列索引单元格的路径的最小成本 限制条件: 1<= m,n <= 100 0 <= tx < m 0 <= ty <n 1 <=

给出了一个维数为m×n的代价矩阵。问题是从中找出最小路径 矩阵中某个单元格的左上角。路径的总成本是该路径中访问的所有单元格的总成本。只允许两次移动:向下移动一行,或向右移动一列。你在任何时候都不能离开矩阵,有些细胞被标记为障碍物,不能被踩到。 应回答以下形式的几个问题:tx ty k。此查询的输出应为kth 从左上角到tx行ty列索引单元格的路径的最小成本 限制条件:

1<= m,n <= 100 0 <= tx < m 0 <= ty <n 1 <= k <= 101 
The obstacles in matrix are marked by "##" (quotes only for clarity) 
The values in every cell that is not an obstacle, varies from -9 to 99 only. 
tx and ty are both 0-indexed. 
If k exceeds the total paths to cell (tx, ty) output "Not so many paths" 
If (tx, ty) is an obstacle, output "Obstacle". 
There will never be an obstacle on the top-left corner or bottom-right corner.


Input: 
 The first line contains the number of test cases T, 
 The first line of each test case contains two space-separated integers m and n. 
 The next m lines each contain n integers, denoting the matrix. 
 The next line contains an integer q, denoting the number of queries to come. 
 The next q lines each contain 3 space separated integers, tx ty and k 
Output: 
 For each query output the kth shortest path 

1我有一个动态规划解决方案

使用3D矩阵
cost[M][N][K]
其中
cost[x][y][i]
表示从右上角到达单元格(x,y)的第i条最短路径

请注意,每个单元格(x,y)只能从单元格(x-1,y)和(x,y-1)到达。因此,我们可以使用for循环按顺序处理单元。这将确保任何单元(x,y)的单元(x-1,y)和(x,y-1)在单元(x,y)之前进行处理

for(int x=0;x
假设我们已经计算了单元(x-1,y)和(x,y-1)的所有k条最短路径,您可以通过对通向单元(x-1,y)和(x,y-1)的2*k条最短路径进行排序来计算单元(x,y)的k条最短路径,方法是选择成本最小的路径并将到达单元(x,y)的成本添加到拾取的路径中。 这可以通过使用传统的排序算法来实现,该算法产生每个单元的O(k log k)时间。但是,由于单元(x-1,y)和(x,y-1)的k条最短路径已经排序,如果时间限制非常紧,可以使用类似于mergesort的技术在O(k)运行时间内对它们进行排序。这将产生一个最佳运行时间O(nmk)和内存O(nmk)


只保存最后一行可以减少内存,因为计算第x行时只需要x-1行,因此我们可以放弃x-1行之前的所有行。

为什么不直接应用?在寻找最短路径方面,它比DFS(“回溯”)要有效得多。Djikstra是否有助于排除障碍?它是否有助于返回第k条最小路径?障碍只是没有链接(或链接成本无限高)的节点,因此无法探测。要找到第K个最小路径,请继续运行Djikstra,直到找到为止-忽略第一个K{-1}更好的情况/终端条件。Wud请解释更多我将如何离开第一个K-1更好的情况…我不明白你…每次运行Djikstra,我们都会得到相同的结果,对吗。。??那个么留下那个些更好的案例会有什么问题呢?::运行一次,但运行一个修改过的版本,直到找到第K个最佳路径才会终止。通常在找到解决方案节点时停止;但请使用计数器,直到找到解决方案节点K次后才停止。
for (int x = 0; x < m; x++) {
    for (int y = 0; y < n; y++) {
       //Process
    }
}