2

给定一个网格点,我试图找到其中两个点之间的路径。

就像在这张照片中:我需要找到黄线的点:

在此处输入图像描述

我可以使用哪些最佳方法/算法?

谢谢

4

3 回答 3

3

查看A* 算法

这是许多视频游戏中用于寻路问题的方法,并且可以构建得非常健壮。

于 2012-05-03T22:07:13.113 回答
1

Dijkstra 的算法可以是一个好的开始。

于 2012-05-03T22:06:52.280 回答
0

您还没有完全定义要如何使用对角线,因此您必须根据需要编写最终函数,我想采用使用对角线的路径最短的路径,注意从 a>c 开始的路径更短比路径 a>b>c 为路径中的 a,b,c

grid = [[False]*16 for i in range(16)]
#mark grid of walls

def rect(p1,p2):
    x1, y1 = p1
    x2, y2 = p2
    for x in range(x1, x2+1):
        for y in range(y1, y2+1):
            yield (x, y)

rects = [((1,2),(5,5)),
    ((5,5),(14,15)),
    ((11,5),(11,11)),
    ((5,11),(11,11)),
    ((4,7),(5,13)),
    ((5,13),(13,13))]

for p1,p2 in rects:
    for point in rect(p1,p2):
        x,y = point
        grid[x][y] = True

start = (1,2)
end = (12,13)

assert(grid[start[0]][start[1]])
assert(grid[end[0]][end[1]])

def children(parent):
    x,y = parent
    surrounding_points = ((x1,y1) for x1 in range(x-1,x+2) for y1 in range(y-1,y+2) if x1>0 and y<15)
    for x,y in surrounding_points:
        if grid[x][y]:
            #not a wall
            grid[x][y] = False
            #set as wall since we have been there already
            yield x,y

path = {}
def bfs(fringe):
    if end in fringe:
        return

    new_fringe = []
    for parent in fringe:
        for child in children(parent):
            path[child] = parent
            new_fringe.append(child)
    del fringe
    if new_fringe:
        bfs(new_fringe)

bfs([start])
def unroll_path(node):
    if node != start:
        return unroll_path(path[node]) + [node]
    else:
        return [start]

path = unroll_path(end)

def get_final_path_length(path):
    #return length of path if using straight lines
    for i in range(len(path)):
        for j in range(i+1,len(path)):
            #if straight line between pathi and pathj
            return get_final_path(path[j+1:]) + distance_between_i_and_j
于 2012-05-04T01:11:05.200 回答