【问题标题】:Algorithm to find positions in a game board i can move to在我可以移动到的游戏板上找到位置的算法
【发布时间】:2016-06-19 16:47:55
【问题描述】:

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

  • 我有一块板,表示为 n x m 方格的矩阵(n 可能等于 m)
  • 里面有p游戏碎片
  • 每个游戏块都有一个预定义的速度,即轮到它可以走多少步
  • 碎片不能重叠
  • 共有三种类型的单元格:那些不需要额外移动才能越过的单元格(通过时您会失去 0 额外速度)、需要 1 次额外移动才能越过的单元格和一些您根本无法通过的单元格穿过(像一堵墙)

所以,给定一个游戏棋子在我的游戏板中某个[i,j] 位置,我想找出:
a) 它可以移动到的所有地方,以它的速度
b) 指向板上某个[k,l] 位置的路径

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

  • 创建一个速度*2+1 大小的方矩阵,表示移动的成本,就好像所有单元格都没有额外的穿越成本(棋子在位置 [速度,速度])
  • 创建另一个速度*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,这个解决方案(还)没有失败,但我没有证据证明它的正确性,我想确保它有效。

【问题讨论】:

  • 你熟悉Dijkstra's algorithm吗?它可能会提供一种更有效的路径计算方式(尽管据我所知,您当前的算法也很好)
  • 是的,事实上我是,但据我所知,它只适用于加权无向图,在这种情况下,从 A 到 B 的成本可能与一个从 B 到 A :(
  • 为了获得piece 可以到达的所有可能点,我建议使用广度优先搜索。您可以将piece 的速度传递给每个 bfs 调用,并查看何时停止遍历。
  • DIjkstra 的算法适用于有向图,在这里似乎是完美的选择。

标签: algorithm computer-science


【解决方案1】:

A-star 是一种标准算法,用于确定二维板上的障碍物和每平方移动成本的最短路径。您还可以使用它来测试特定移动是否有效,但要实际生成所有有效移动,我只需从起始位置开始,在每个方向上移动一个正方形标记,哪些正方形是有效的,然后从每个新的重复确保不再访问同一个广场的地方。这将是一个递归算法,每次调用最多调用自己 4 次,并会有效地为您生成有效的移动。如果有限制,例如您可以以不同的成本一次移动多少个方格,只需超过每个方格的运行总距离即可。

【讨论】:

  • 我忘了说的是我的棋子可以对角移动,这会影响这种找到所有有效移动的方法吗?
  • 这个方法仍然有效,只是每个方格有八个地方可以去。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多