【问题标题】:Easiest to code algorithm for Rubik's cube?最简单的魔方编码算法?
【发布时间】:2009-08-30 21:30:22
【问题描述】:

在 Java 中编写用于求解魔方的相对简单的算法是什么。效率也很重要,但却是次要的考虑因素。

【问题讨论】:

  • 这个问题的措辞很糟糕,被投票“正确”的问题实际上并不是正确的答案。这说明了为什么“最简单的编码算法”可能不是您想要的——程序可能永远不会完成。它说明了为什么您需要关注效率。
  • 你可以改写为,'什么是最简单的编码算法,可以在我们的一生中产生结果':-)

标签: java algorithm rubiks-cube


【解决方案1】:

执行随机操作,直到找到正确的解决方案。最简单的算法,效率最低。

【讨论】:

  • 哈哈哈 4.33 * 10^19 的排列确实是效率最低的 :-)
  • @Rushyo lol 打得很好,先生@Yannick 你能解释一下你是如何计算排列的吗?
  • 我的数学不太好,但如果我说是对的,因为中间的 6 块将始终保持在我们拥有的同一个位置,6*8 = 48 个点和 8 块 6 种不同颜色它可以占据这些位置,因此可能的排列将是 (48!)/((8!)(8!)(8!)(8!)(8!)(8!))
  • 作者是对的:这是最容易实现的算法,但也是性能最差的算法。它不会在我们的有生之年找到解决方案。
  • 引自维基百科:“原始 (3×3×3) 魔方有八个角和十二个边。有8个! (40,320) 种方式来排列角立方体。七个可以独立定向,而第八个的方向取决于前面的七个,给出了 37 (2,187) 种可能性。有 12!/2 (239,500,800) 种方式来排列边缘,因为角的奇数排列也意味着边缘的奇数排列。 11 条边可以独立翻转,第 12 条的翻转取决于前面的,提供 211 (2,048) 种可能性。[19]'
【解决方案2】:

我发现的最简单的非平凡算法是这个:

http://www.chessandpoker.com/rubiks-cube-solution.html

编写代码看起来并不难。 Yannick M.'s answer 中提到的链接看起来也不错,但是 'the cross' 步骤的解决方案对我来说可能有点复杂。

您可能希望了解许多开源求解器实现。这是Python implementation。这个Java applet 还包括一个求解器,源代码可用。还有一个Javascript solver,也有可下载的源代码。

Anthony Gatlin's answer 很好地说明了 Prolog 非常适合这项任务。这是一篇关于如何编写自己的Prolog solver 的详细文章。它使用的启发式方法特别有趣。

【讨论】:

    【解决方案3】:

    可能想查看:http://peter.stillhq.com/jasmine/rubikscubesolution.html

    具有求解 3x3x3 魔方的算法的图形表示

    【讨论】:

      【解决方案4】:

      我了解您的问题与 Java 有关,但实际上,Prolog 等语言更适合解决魔方等问题。我认为这可能是针对一门课的,您可能没有选择工具的余地。

      【讨论】:

      • 没错,不幸的是我必须用Java来做这门课
      • 解决办法很明显:用Java写一个prolog解释器!
      【解决方案5】:

      您可以通过 BFS(广度优先搜索)来做到这一点。我认为实现并不难(它是图形类别下最简单的算法之一)。通过使用称为队列的数据结构,您真正要做的是构建 BFS 树并找到从给定条件到期望条件的所谓最短路径。该算法的缺点是效率不够(没有任何修改,即使求解 2x2x2 立方,所需的时间也约为 5 分钟)。但是你总能找到一些技巧来提高速度。

      说实话,这是麻省理工学院“Introduction of Algorithm”课程的作业之一。这是作业的链接:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/assignments/MIT6_006F11_ps6.pdf。他们有一些库可以帮助您将其可视化并帮助您避免不必要的工作。

      【讨论】:

        【解决方案6】:

        供您参考,您当然可以查看这个 java 实现。 --> Uses two phase algorithm to solve rubik's cube。并且已经尝试过这段代码,它也能正常工作。

        【讨论】:

        • 感谢提及陈爽存储库。实际上,他的代码完全基于 Kociemba 算法,这是有史以来最好的编程作品之一。
        【解决方案7】:

        我猜一个解决方案是同时运行所有可能的路线。这听起来确实很愚蠢,但逻辑是这样的——超过 99% 的可能争夺将在 20 步内解决。这意味着,尽管您循环通过大量的可能性,但您最终仍会这样做。从本质上讲,这可以通过将您的第一步作为加扰的立方体来实现。然后,您会将新的多维数据集存储在变量中,以针对第一个多维数据集上的每个可能移动。对于这些新立方体中的每一个,您都执行相同的操作。在每次可能的移动后检查它是否完成,如果是,那么这就是解决方案。在这里,为了确保您有解决方案,您需要在每个魔方上提供一些额外的数据,说明为达到该阶段所做的动作。

        【讨论】:

          猜你喜欢
          • 2015-12-06
          • 2014-12-14
          • 2018-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多