通过坐标的最短距离

时间:2016-03-29 07:58:00

标签: algorithm computational-geometry shortest-path

我在x-y平面给出一组点= {(x1,y1),(x2,y2),.....(xn,yn)}

我给了两个点a(xa,ya)和b(xb,yb)并要求找到覆盖最短路径的点集。

点之间没有连接。如果我假设与每个其他点的连接。将花费很长时间来计算加权图的这些值。有人能告诉我我应该做什么阅读。这个问题在图算法下有什么主题?!!(有没有特定的算法)我已经坚持了好几天。注意:需要经过积分。不能跨越点。无需穿越套装中的每一个点。只是指出要点B的点,这样做的距离应该是最小的。例如:{(1,3),(1,4),(1,1),(5,2),(5,3),(1,4),(2,2),(1,2) ,(1,3)} 并假设A =(1,1)和B =(1,4)然后路径= {(1,1),(1,2),(1,3),(1,4)} 注意:路径不必是直线。也可以是锯齿形。

2 个答案:

答案 0 :(得分:0)

对于解决这个问题,可能更正式的“跳过点”定义是至关重要的。您可以从计算不违反不跳跃规则的边缘的距离开始。接下来使用Dijkstra算法或A *处理图形。首先要找到如何在数学上识别有效边。

答案 1 :(得分:0)

由于我们一次最多可以移动两个距离单位,我们可以轻松地使用集合实现DFS遍历,并简单地猜测点是否存在,因为我们必须每点最多猜测8个点:

input: set points //a set of points that are placed on the grid
       point a
       point b
output: list path //a list of points, from a to b

map predecessor
predecessor.put(a , null)

set visited
visited.add(a)

//stores pairs consisting of (distance traveled , point)
//ordered ascending by distance to a
sortedset tovisit(sortyBy(pair::first , comparison::ascending)) 
tovisit.add(pair(0 , a))

//flag to check, if path was found
bool pathFound = false

while !tovisit.isEmpty()
    pair search = tovisit.remove(0)
    int dist = search.first()
    point pt = search.second()

    //check if we reached the end of the path
    if pt == b
        pathFound = true
        break

    //check if a point exists down from the current point
    //with a distance of at most 2 units that hasn't been visited
    point next = point(pt.x , pt.y + 1)
    if points.contains(next)
        if !visited.contains(next)
            predecessor.put(next , a)
            tovisit.add(pair(dist + 1 , next)
    else if points.contains(point(next.x , next.y + 1)
        next = point(pt.x , pt.y + 2)
        if !visited.contains(next)
            predecessor.put(next , a)
            tovisit.add(pair(dist + 2 , next)

    //proceed for other directions
    //...    

//build path
if !pathFound
    return null

list path
node tmp = b
do
    path.prepend(tmp)
    tmp = predecessor.get(tmp)
while tmp != null

return path

此代码利用了这样一个事实:我们每个方向最多只能遍历2个单位,因此我们最多只能检查8个方向。

如果没有给出,我们必须首先构建一个表示网格的数据结构。一个简单的解决方案是构建一个网格,其中每个点都连接到它的直接邻居(最差情况O(n ^ 2))并使用DFS遍历此网格。