【问题标题】:Using Single Source Shortest Path to traverse a chess board使用单源最短路径遍历棋盘
【发布时间】:2015-10-12 23:55:10
【问题描述】:

假设我们有一个 n x n 棋盘(或换句话说,一个矩阵),每个方格都有一个权重。一块可以水平或垂直移动,但不能沿对角线移动。每次移动的成本将等于棋盘上两个方格的差。使用一种算法,我想找到单个棋子从平方 (1,1) 移动到平方 (n,n) 的最小成本,这在多项式时间内具有最坏情况的时间复杂度。

可以使用 dikstras 算法来解决这个问题吗?我下面的算法能解决这个问题吗? Diijkstras 已经可以在多项式时间内运行,但它的时间复杂度是什么?

伪代码:

我们有一些空集 S,一些整数 V,并输入一个未加权的图。之后,我们完成了一个邻接矩阵,显示没有无穷大加权顶点的边的成本,虽然矩阵没有选择所有顶点,但我们找到了一个顶点,如果平方值小于我们当前所在的平方,移动到那个正方形并用两个正方形之间的差异更新 V 并更新 S 标记每个访问过的顶点。我们执行此过程,直到没有更多顶点为止。

谢谢。

【问题讨论】:

  • Could dikstras algorithm be used to solve this? 假设差值取绝对值,那么是的
  • @svs 但是如果我想在多项式时间内使用它,我是否必须使用无向或有向实现?
  • 没关系。时间复杂度是一样的
  • @svs 我知道这很难实现,但是什么会使这样的算法具有多项式时间的时间复杂度?
  • algorithm like this 如果您谈论您的算法,我很难理解它。 Dijkstra 就足够了。您还可以使用动态编程来解决您的问题。复杂度为O(MN),其中MxN 是您的电路板大小。

标签: algorithm matrix graph shortest-path chess


【解决方案1】:

由于您正在尝试找到最低成本路径,因此您可以使用 Dijkstra 的方法。由于 Dijkstra 在最坏的情况下是 O(|E| + |V|log|V|),其中 E 是图中的边数,V 是图中的顶点数,这满足了您的多项式时间复杂度要求。

但是,如果您的算法仅考虑与移动的开始和结束格相关的成本,而不考虑中间节点,那么您必须将所有可能的开始和结束格连接在一起,以便您可以采取“捷径”中间节点。

【讨论】:

  • 非常感谢您的帮助! |V| 有可能吗?要平方?换句话说,|V|^2 是最坏情况还是最佳情况时间复杂度?
  • 您想降低算法的效率吗? V log V 的时间复杂度比 V^2 好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
相关资源
最近更新 更多