骰子问题的算法

时间:2010-05-06 08:54:21

标签: algorithm

我在想什么应该是找到这个难题的所有解决方案的最佳算法。

http://1cup1coffee.com/puzzle/endice/

可以回溯是解决这个问题的方法,还是可以建议其他方法?

谢谢

2 个答案:

答案 0 :(得分:1)

如果您想要所有解决方案,那么回溯绝对是您的选择。 BFS / A * / Dijkstra和其他人可能会工作(需要证明它),但无论哪种方式,他们很可能都不会给你所有的解决方案。

回溯不应该花太长时间,因为可玩区域非常小而且你的棋子和动作数量相对较少,这样可以获得良好的启发式。

答案 1 :(得分:1)

为了避免搜索每个可到达的位置,您需要一种快速确定某个位置是否无法解决的方法。您将无法快速排除所有无法解决的职位,但您可以排除其中许多职位。

要检查的是每个模具D,并且对于每个孔H,模具D是否可能到达孔H.即使这不容易弄清楚。作为一个保守的界限,你可以将所有骰子上剩下的数字相加,假设D剩下那么多的移动(因为这些运动中的每一个理论上都可以推动D),并且看看D是否可以达到H.作为稍微不那么保守绑定,您可以将所有多余的移动分配给E最接近能够推动D的那个,然后看看D(有E的帮助)是否可以达到H.

一旦你确定哪个骰子仍然能够到达哪个洞,如果有一个无法到达任何洞的骰子,或者任何骰子无法到达的洞,那么这个位置是无法解决的。类似地,如果有N个骰子无法到达N个不同的洞,或者H个洞不能被N个不同的骰子到达,那么这个位置是无法解决的。

这种启发式方法不能完全解决您的问题,但它可能会使搜索空间对某些范围的电路板更易于管理。