我正在尝试用C语言开发一个解决魔方的程序。我使用了回溯技术,但这是一个非常耗时的过程,并且需要很多迭代,所以我无法解决它。
请给我一些建议,告诉我如何更有效地解决这个问题-例如其他技术或采用回溯本身。在Google上我找到了很多快捷方式来解决这个问题,但我不想使用快捷方式来解决它。
请给我一些建议,告诉我如何更有效地解决这个问题-例如其他技术或采用回溯本身。在Google上我找到了很多快捷方式来解决这个问题,但我不想使用快捷方式来解决它。
有许多算法可用于解决魔方问题,然而,您可以参考这个最优算法http://en.wikipedia.org/wiki/Optimal_solutions_for_Rubik's_Cube
。请注意,此链接将带您进入维基百科页面。我不确定我理解你的问题以及你所说的快捷方式是什么意思。 如果你正在使用一些动态规划方法来解决魔方,你需要确保你向前看足够多的步骤才能达到解决方案。 我相信,如果你只支持2种移动类型(向右旋转,向上旋转),你需要向前看12步(不确定)才能在每次移动之前决定正确的移动,以确保解决方案。
如果你正在做类似这样的事情,并且发现你的内存空间已经用完了,那么请记住,你只需要保留你正在遍历的路径,以便决定正确的解决方案(而不是整个树)。
我成功地使用这种方法在Java中解决了魔方,所以C语言应该没有问题(就内存占用而言)。
魔方的状态空间大小约为265。盲目搜索状态空间的回溯算法可能需要检查大部分状态空间才能找到解决方案,因此显然简单的回溯算法不会很好地工作。但是,这个问题已经被解决了很多次。例如,请参见http://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf。
如果您不关心移动次数,这里有一种方法可以将状态空间分割,以便您的暴力方法可以工作。