给出尺寸为N×M的2-D矩阵。每个单元格中的数据表示穿过单元格的时间。一些块包含表示炸弹的负值。我们需要找到从[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}
答案 0 :(得分:2)
如果2D矩阵是图形,那么每条边的遍历成本是相同的。在这种情况下,Djikstra等同于BFS。由于每个单元格的交叉成本不同,因此Djikstra在这里并不等同于BFS。 BFS将确定穿越所需的最小细胞数,但不是最小时间。所以要求是Djiksta的。这回答了您的第一个问题。
我假设您知道如何实施Djikstra。您面临的问题是如何在这个问题上实现它。为此,您需要将2D矩阵表示为图形。产生的主要问题是如何捕获图中节点值的关系。这可能是因为您习惯于考虑边缘上的权重,而不是顶点上的权重。但是,你可以简单地将问题减少到Djikstra,使其成为有向图,其中从[i][k]
到[j][k]
的边缘成本为[j][k]
的值,以及向后方向的边缘成本为[i][k]
的值。要结合炸弹的概念,不要为这些细胞生成顶点。在此之后,应用Djikstra应该是直截了当的。
答案 1 :(得分:1)
从2D网格创建图形(每个位置都是一个节点,边缘到上方,下方,右侧和左侧的位置。炸弹位置只是不进入),但是在您完成初始化之后创建,使用第2步:
假设节点(x,y)
的值为8,可以从四个节点访问(在网格中:一个在上面,右边,左边和下面)。您将节点转换为4个节点 - 一个节点与每个邻居相邻,这四个节点在它们之间连接(clique),边缘值为8.
在所有图表上完成此操作后,运行Dijkstra ...