我有一些笛卡尔坐标的点,形式如:(x,y)
其中x和y都是非负整数。
例如:
(0,0) ,(1,1),(0,1)
我需要一个算法来排列上述点
使得从一个点到另一个点时
要么x加一,要么y加一。
换句话说,我想避免
对角线移动。
因此,上述提到的点将被排列为:
(0,0), (0,1), (1,1)。
对于(0,0),(1,1),(0,2)
没有这样的排列可能。
我不确定该怎么称呼它
但我会称之为曼哈顿排序。
有人能帮忙吗?
我有一些笛卡尔坐标的点,形式如:(x,y)
其中x和y都是非负整数。
例如:
(0,0) ,(1,1),(0,1)
我需要一个算法来排列上述点
使得从一个点到另一个点时
要么x加一,要么y加一。
换句话说,我想避免
对角线移动。
因此,上述提到的点将被排列为:
(0,0), (0,1), (1,1)。
对于(0,0),(1,1),(0,2)
没有这样的排列可能。
我不确定该怎么称呼它
但我会称之为曼哈顿排序。
有人能帮忙吗?
可以将其看作一个图,其中每个节点最多有四条边。然后进行深度/广度优先搜索。
这可以简化为最小化每个连续点之间的距离。从(0,0)到(0,1)只需1个单位,但从(0,0)到(1,1)实际上是sqrt(2)。因此,如果您将点排列成图形,然后执行简单的最小总距离遍历(旅行商),它应该正确地排列它们。
编辑:如果您永远不希望步骤大于1,请不要添加任何大于1的边缘。遍历仍将正常工作,并忽略需要移动> 1的任何路径。
编辑2:为了进一步澄清,您可以使用任何边缘选择算法。如果您可以接受它移动2个空格,只要空格不是对角线,那么您可以选择在(0,2)和(0,4)之间放置边缘。最小距离算法仍将起作用。只需以聪明的方式放置边缘,您就可以使用任何数量的选择标准来确定结果。
{ (0,0), (1,0), (0,1) }
,您该怎么办?需要更多信息。 - Nick Larsen{ (1,0), (1,1), (0,1), (2,1) }
,您的旅行商人有一条合法路径,但必须至少经过 (1,1)
两次。您的算法将如何响应此集合? - Nick Larsen一种方法是创建两个按坐标排序的列表。一个按x排序,另一个按y排序。然后,递归地找到解决方案。
代码即将到来(还不确定使用什么语言,也许是伪代码?)...编辑-算了,因为我的答案并不像其他一些答案那样好。
如何使用暴力递归REXX例程...尝试所有可能的路径并打印出有效的路径。
/* rexx */
point. = 0 /* Boolean for each existing point */
say 'Enter origin x and y coordinate:'
pull xo yo
point.xo.yo = 1 /* Point exists... */
say 'Enter destination x and y coordinate:'
pull xd yd
point.xd.yd = 1 /* Point exists... */
say 'Enter remaining x and y coordinates, one pair per line:'
do forever
pull x y
if x = '' then leave
point.x.y = 1
end
path = ''
call findpath xo yo path
say 'All possible paths have been displayed'
return
findpath: procedure expose point. xd yd
arg x y path
if \point.x.y then return /* no such point */
newpoint = '(' || x y || ')'
if pos(newpoint, path) > 0 then return /* abandon on cycle */
if x = xd & y = yd then /* found a path */
say path newpoint
else do /* keep searching */
call findpath x+1 y path newpoint
call findpath x-1 y path newpoint
call findpath x y+1 path newpoint
call findpath x y-1 path newpoint
end
return
示例会话:
Path.rex
Enter origin x and y coordinate:
0 0
Enter destination x and y coordinate:
2 2
Enter remaining x and y coordinates, one pair per line:
0 1
1 1
2 1
1 2
(0 0) (0 1) (1 1) (2 1) (2 2)
(0 0) (0 1) (1 1) (1 2) (2 2)
All possible paths have been displayed
不过,不要在任何大型项目上尝试这样做 - 这可能需要很长时间!但是问题从来没有提到过要求最优解。