在游戏板中找到位置的算法我可以移动到

时间:2016-06-19 16:47:56

标签: algorithm computer-science

我遇到的问题如下(简化):

  • 我有一块板,表示为n×m个正方形的矩阵(n可能等于m)
  • 其中有 p 游戏棋子
  • 每个游戏棋子都有一个预先定义的速度,即它可以采取多少步骤#
  • 碎片不能重叠
  • 有三种类型的细胞:那些不需要额外运动的细胞(你通过时你会增加0倍的速度),那些需要额外运动需要交叉的细胞和一些你可以简单的#&# 39;通过(如墙)(

所以,考虑到游戏板上某个[i,j]位置的游戏,我想知道:
a)所有可以移动的地方,以及它的速度
b)董事会中某个[k,l]职位的路径

a)解决了,b)几乎是微不足道的。 目前我使用的算法如下,假设一种大小为n的数组从0转到n-1的语言:

  • 创建一个速度* 2 + 1大小的sqaure矩阵,表示移动的成本,好像所有单元格都没有额外的成本要交叉(该块位于[速度,速度]位置)
  • 创建另一个速度* 2 + 1大小的方形矩阵,这个矩阵具有每个单元格的额外成本(那些不能跨越的单元格,因为它是墙壁或其中有另一个单元具有值无限的)(该片位于[速度,速度]的位置)
  • 创建另一个速度* 2 + 1尺寸的方形矩阵,它是前两个的总和(该部分位于[速度,速度]位置上)
  • 纠正后一个矩阵,确保每个单元格的值为:所有相邻单元的最小成本+ 1 +单元的额外成本。如果不是,我会更正它并重新开始使用矩阵。

一个例子:
P是片段,W是墙,E是空单元格,无需额外移动,X是需要 1 额外移动的单元格越过。

X,E,X,X,X
X,X,X,X,X
W,E,E,E,W
W,E,X,E,W
E,P,P,P,P

第一个矩阵:

2,2,2,2,2    
2,1,1,1,2    
2,1,0,1,2    
2,1,1,1,2    
2,2,2,2,2 

第二个矩阵:

1,0,1,inf,1    
1,1,1,1,1    
inf,0,0,0,inf    
inf,0,1,0,inf    
0,inf,inf,inf,inf

总和:

3,2,3,3,3    
3,2,2,2,3    
inf,1,0,1,inf    
inf,1,2,1,inf    
inf,inf,inf,inf,inf  

由于[0,0]不是2+1+1,我更正了: 总和:

4,2,3,3,3    
3,2,2,2,3    
inf,1,0,1,inf    
inf,1,2,1,inf    
inf,inf,inf,inf,inf  

由于[0,1]不是2+1+0,我更正了: 总和:

4,3,3,3,3    
3,2,2,2,3    
inf,1,0,1,inf    
inf,1,2,1,inf    
inf,inf,inf,inf,inf

由于[0,2]不是2+1+1,我更正了: 总和:

4,2,4,3,3    
3,2,2,2,3    
inf,1,0,1,inf    
inf,1,2,1,inf    
inf,inf,inf,inf,inf

哪一个是正确答案?
我想知道的是,如果这个问题有一个名字,我可以搜索它(无法找到任何东西),或者是否有人可以告诉我如何解决 a)这一点。

请注意,我想要最佳解决方案,因此我选择了动态编程算法。随机助行器可能会更好吗? AFAIK,这个解决方案没有失败(但是),但我没有证据证明它是正确的,我想确定它有效。

1 个答案:

答案 0 :(得分:1)

A-star是一种标准算法,用于确定最短路径在2d板上给出障碍物以及每平方移动成本。您还可以使用它来测试特定移动是否有效,但是为了实际生成所有有效移动,我只需从起始位置开始,在每个方向上移动一个方形标记,哪个方块有效,然后从每个新方向重复确保不再访问同一个广场的地方。它将是一个递归算法,在每次调用时最多调用自己4次,并有效地生成有效的移动。如果有一些限制,例如你可以一次性移动多少个方格而且费用不同,只需通过每个方格你可以走多远的总计。