我在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)} 注意:路径不必是直线。也可以是锯齿形。
答案 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遍历此网格。