Java中的寻路

时间:2011-03-03 04:51:14

标签: java algorithm

假设我使用数组来绘制我的游戏地图:

{ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 1 }

我有ArrayList<>个平铺数字已被阻止而其他数据块未被阻止。我可以通过blocked(X,Y)进行检查,它会返回truefalse,方法是检查当前地图上该图块的X和Y,然后它会看到该图块是否在BLOCKED中{ {1}}。无论如何,这里最好的寻路方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以使用图搜索算法,例如Breadth-first search。 您可以在谷歌中找到的实现,有很多例子。

答案 1 :(得分:0)

我认为通过寻路你的意思是你想找到从细胞(x1,y1)到细胞(x2,y2)的最短路径。 这里需要更多信息。如何定义相邻的单元格 - 即我可以从一个单元格移动到其4个邻居或6个邻居(包括对角线移动)?移动到任何一个celll的成本是相同的,还是根据单元格的类型或是行/ coloumn移动还是对角移动而变化?

假设所有单元格的移动成本相同,并且每个单元格与4个单元格相邻,它共享边缘,这基本上是在简单的未加权图形中找到最短路径的简单问题。为此,您可以使用breadth first search。图形的节点是单元格,并且每个单元格(除了顶部和底部行以及左侧和最右侧颜色的那些)具有四个边缘(每个相邻单元格一个)。当我们访问每个节点时,我们只是跳过被阻止的节点。

伪代码:

shortest path(start,end, blocked):
   cost=map of node:int
   visited=set of nodes
   dx=array {0,1,0,-1}
   dy=array {1,0,-1,0}
   Q=queue of nodes
   cost[start]=0
   add start to Q
   while Q is not empty:
       node=remove top from Q
       for i=0 until 4:
           next=new node with next.x=node.x+dx[i], next.y=node.y+dy[i]
           if (next is a valid node) and (next is not in visited) and (next is not in blocked):
              cost[next]=cost[node]+1
              add next to visited
              add next to Q
    if end is in visited:
       return cost[end]
    else:
       return -1