用 Java 编写解决魔方的相对简单的算法是什么。效率也很重要,但只是次要考虑。
7 回答
执行随机操作,直到获得正确的解决方案。最简单的算法,效率最低。
我发现的最简单的非平凡算法是这个:
http://www.chessandpoker.com/rubiks-cube-solution.html
编写代码看起来并不难。Yannick M. 的答案中提到的链接看起来也不错,但“交叉”步骤的解决方案对我来说可能有点复杂。
您可能想查看许多开源求解器实现。这是一个Python 实现。这个Java 小程序还包括一个求解器,并且提供了源代码。还有一个Javascript 求解器,也带有可下载的源代码。
Anthony Gatlin 的回答很好地说明了 Prolog 非常适合这项任务。这是一篇关于如何编写自己的Prolog 求解器的详细文章。它使用的启发式方法特别有趣。
可能想看看: http: //peter.stillhq.com/jasmine/rubikscubesolution.html
具有求解 3x3x3 魔方的算法的图形表示
我知道您的问题与 Java 有关,但实际上,像 Prolog 这样的语言更适合解决魔方等问题。我认为这可能是针对一堂课的,您可能没有选择工具的余地。
您可以通过执行 BFS(广度优先搜索)来做到这一点。我认为实现并不难(它是图形类别下最简单的算法之一)。通过使用称为队列的数据结构,您真正要做的是构建 BFS 树并找到从给定条件到期望条件的所谓最短路径。该算法的缺点是效率不够(没有任何修改,即使求解 2x2x2 立方,所需的时间也约为 5 分钟)。但是你总能找到一些技巧来提高速度。
老实说,这是麻省理工学院“算法导论”课程的功课之一。这是作业的链接: http: //ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/assignments/MIT6_006F11_ps6.pdf。他们有一些库可以帮助您将其可视化并帮助您避免不必要的工作。
供您参考,您当然可以查看这个 java 实现。--> 使用两阶段算法求解魔方。并且已经尝试过这段代码,它也可以工作。
一种解决方案是我猜同时运行所有可能的路线。这听起来确实很愚蠢,但逻辑是这样的——超过 99% 的可能争夺将在 20 步内解决。这意味着,尽管您循环通过大量的可能性,但您最终仍会这样做。从本质上讲,这可以通过将您的第一步作为加扰的立方体来实现。然后,您会将新的多维数据集存储在变量中,以针对第一个多维数据集上的每个可能移动。对于这些新立方体中的每一个,您都执行相同的操作。在每次可能的移动后检查它是否完成,如果是,那么这就是解决方案。在这里,为了确保您有解决方案,您需要在每个魔方上提供一些额外的数据,说明为达到该阶段所做的动作。