【问题标题】:Turning Recursive algorithm into breadth-first queue将递归算法变成广度优先队列
【发布时间】:2015-02-19 19:44:53
【问题描述】:

所以我正在使用“课程”。课程充满坐标。每个坐标都有允许移动的属性(#left #right #up #down)。课程是建立在一个坐标系上的,所以左边是 x-1,右边是 x+1,向上是 y-1,向下是 y+1。

我的目标是获得每个可达坐标的最短距离。 距离由从起点(参数中提供的路线的起点坐标)的移动次数定义。所以从 (0,0) 到 (1,2) 的距离将是 3. 1 右和 2 下 我最初使用递归解决了这个问题:

答案:与其尽可能深入地遍历每个路径,不如使用数组一次遍历每个差异内的每个路径

【问题讨论】:

  • 你遇到了什么错误?
  • 您应该更正缩进。这可能表明第二部分中有一个额外的end。此外,对读者进行格式化是一种礼貌,以便无需水平滚动即可阅读代码(即,将长语句分成多行)。
  • @IVlad 我收到 Queue.new() 的名称错误,我不确定如何修复该部分。我也相信,一旦我修复了这个错误,它就不会起作用,因为我不知道正确计算动作
  • However, this recursive algorithm takes too long to go through the large courses - 请注意,深度优先搜索的复杂性和广度优先搜索的复杂性是相同的。如果这是您递归搜索的唯一问题,那么您不太可能仅通过更改为 BFS 来解决它。
  • 请定义“可达坐标”的含义。我猜这与无向图有关,如果两个节点(坐标)之间的距离(适当定义)为1,则它们通过链接连接。另外,您说您想要“每个可达坐标的最短距离”。除了定义“距离”之外,您还需要指定确定每个坐标的距离的位置。也许您的意思是每对相互“可达”的坐标之间的最短距离。对我来说,这听起来越来越像是一个最短路径问题。

标签: ruby algorithm recursion queue breadth-first-search


【解决方案1】:

将您的问题想象成一个以节点为坐标的无向图,其中每对(不同的)节点 [x0,y0][x1,y1] 在以下情况下是“相邻的”:

[x0-x1].abs <= 1 && [y0-y1].abs <= 1

如果两个节点相邻,则通过无向链接连接,在这种情况下,该链接的长度为 1。如果两个节点通过节点和链接的路径连接,则它们之间的距离等于长度之和路径上的链接数(即路径中的链接数)。

您可以通过使用一种算法来计算无向图中所有节点对之间的最短路径,例如Floyd-Warshall algorithm(也适用于有向图),从而找到所有坐标对之间的最短距离。

Floyd-Warshall 将不相邻的节点对视为通过无限长的链接(可以实现为适当大的数字)连接。如果发现给定节点对之间的最短路径的长度是“无限的”,则您知道节点没有连接(即坐标之间没有路径)。

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多