我不知道如何解决这个难题。如果有人让我知道如何思考或解决这个问题会很有帮助

时间:2018-03-09 06:34:41

标签: algorithm graph tree

Ritik - 空想家Ritik是一个有梦想的人,他一直梦想着日夜,想知道时空,科幻等等。今天又是另一天,他梦见银河网格,他应该在那里拯救他的朋友 Kriti

现在,这个网格略微不同寻常,包括两个物种Vilgax和Arkaknight。 Vilgax很糟糕,可以冻结你一段时间,而 Arkaknight很好,让你从一个地方跳到另一个地方。网格由m行和n列组成。每个单元由一个正整数,负整数或零整数组成。在左上角正好有两个零,网格的右下角正好分别代表Ritik和Kriti的初始位置。正整数表示Arkaknight。它使您能够从单元格跳转到另一个包含网格内任何位置的相同整数。例如 - 包含2的单元格可以让您跳转到网格中包含2的任何其他单元格(如果有)。负整数表示Vilgax。它冻结了一段时间,你不能移动特定的时间单位,由该单元格中存在的整数的绝对值表示。例如,包含-3的单元格会让你在该单元格中冻结3个单位的时间即你不能移动或跳转到任何其他细胞。 Ritik还可以移动到任何共用一个公共墙的单元,即在网格内彼此相邻(顶部,左侧,右侧和底部)。从一个单元格跳到另一个单元格需要一个单位时间。你的任务是告诉Ritik在给定m x n网格时到达Kriti的最小时间单位。输入格式第一行输入包含行数-M。输入的第二行包含列数-N。然后,M行输入分别包含N个整数。

  

注意:正整数的范围为[1,M * N],包括两个端点,负整数的范围可以从[-1, -( M * N ) ]开始。约束1 <= M <= 1000 1 <= N <= 1000输出格式打印Ritik到达Kriti所用的最短时间。

示例TestCase 1

Input 3 
3 
0 2 3 
-1 2 -3 
3 2 0 

输出 3

2 个答案:

答案 0 :(得分:1)

我们的想法是从输入中构建有向图,并在该图中搜索最短路径

构建图表

  • 对于每个网格单元x构造节点N(x)。
  • 对于共享正数或彼此相邻的两个网格单元x和y,通过构建两个节点连接两个节点N(x)和N(y) 边E(N(x),N(y))和E(N(y),N(x)),相关成本为1.
  • 对于保持负数k的网格单元x add | k | N(x)的所有输出边E(N(x),N(y))的成本。

图表找到最短路径,从与左上方网格单元格对应的节点开始,到使用Dijkstra对应于右下网格单元格的节点结束

答案 1 :(得分:1)

我们的想法是从您的输入构建加权有向图并搜索该图中的最短路径。

构建加权有向图

  • 对于每个网格单元x构造节点N(x)。
  • 对于共享相同正数的两个网格单元x和y 彼此相邻地将两个节点N(x)和N(y)连接起来 建立两个边E(N(x),N(y))和E(N(y),N(x))与相关联 重量1。
  • 对于保持负数k的网格单元x add | k |重量 N(x)的所有输出边E(N(x),N(y))。的即。 | k | +1,其中为移动添加了1。

使用 FLOYD WARSHALL算法后,图表找到从对应于左上方网格单元的节点开始到结束于右下方网格单元的节点的最短路径