将递归算法转换为广度优先队列

时间:2015-02-19 19:44:54

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

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

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

答案:不要尽可能深入地浏览每一个,而是使用数组一次遍历每个差异中的每条路径

1 个答案:

答案 0 :(得分:1)

将您的问题视为无向图,其中节点是坐标,其中每对(不同)节点[x0,y0][x1,y1]是"相邻"如果:

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

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

您可以通过使用算法计算所有坐标对之间的最短距离,该算法计算无向图中所有节点对之间的最短路径,例如Floyd-Warshall algorithm(也适用于有向图)。 / p>

Floyd-Warshall将非相邻节点对视为通过无限长度的链路连接(可以实现为适当大的数量)。如果发现给定节点对之间的最短路径的长度为&#34;无限&#34;,则表示节点未连接(即,坐标之间没有路径)。