【发布时间】: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