找回密码
 立即注册
首页 业界区 业界 魔方求解器程序(层先法,java版本)

魔方求解器程序(层先法,java版本)

袁勤 2025-6-4 20:54:51
实现了一个三阶魔方的层先法求解程序:https://github.com/davelet/java-puzzle-resolver
欢迎试用。
用法

1. 随机试用

不关注起始状态的话可以用程序的随机拧乱工具打乱然后复原:
  1.     private Cube cube;
  2.     private CubeSolver cubeSolver;
  3.     private CubeShuffler cubeShuffler;
  4.     @BeforeEach
  5.     void setUp() {
  6.         cube = new Cube();
  7.         cubeSolver = new CubeSolver(cube);
  8.         cubeShuffler = new CubeShuffler(cube);
  9.     }
  10.        
  11.     @Test
  12.     void solve_ExecuteBottomCornerSolver() {
  13.             // 打乱魔方,随机拧20次
  14.             cubeShuffler.shuffle(20);
  15.             // 执行测试
  16.             cubeSolver.solve();
  17.             // 验证结果
  18.             assertTrue(cube.isSolved());
  19.     }
复制代码
2. 特定状态的求解

要把状态初始化成某个特定状态,可以使用Cube的构造器:
  1. public class Cube implements Cloneable {
  2.     private final Color[][][] state;
  3.     public Cube() {
  4.         state = new Color[6][SIZE][SIZE];
  5.         initializeCube();
  6.     }
  7. // 使用这个方法传入一个三维数组
  8.     public Cube(Color[][][] state) {
  9.         this.state = state;
  10.         if (!isValid()) {
  11.             throw new IllegalArgumentException("提供的状态不是有效的魔方状态");
  12.         }
  13.     }
  14.         // ...其他代码
  15.        
  16. }
复制代码
状态是一个三维数组,维度分别是某个面、某一行、某一列。所以面做多6个(0~5),行和列做多3个。
数组的元素是 Color 枚举对象:
  1. public enum Color {
  2.     WHITE("白", "\u001B[37m"),
  3.     YELLOW("黄", "\u001B[33m"),
  4.     RED("红", "\u001B[31m"),
  5.     ORANGE("橙", "\u001B[38;5;208m"),
  6.     BLUE("蓝", "\u001B[34m"),
  7.     GREEN("绿", "\u001B[32m");
  8.         // ...
  9. }
复制代码
特别要注意的是,这里要求必须是标准魔方且不能转动魔方的方向

也就是说,魔方的六个面必需遵守 上黄下白前蓝后绿左橙右红 的布局;这样就要求状态数组中每个面的中心块 (state[face][1][1])对应是面的颜色。
求解

层先法的逻辑毕竟简单清晰。但是我实现过程中也查了非常多资料,因为不同博客对层先法的过程说得不一样,尤其是顶层还原的时候。
而且我要实现的是求解过程不转动魔方方向,只拧某一层。很多资料都让上下颠倒魔方,或者找一个目标块放到左(右)手边。
求解过程每次拧动魔方(执行一套公式,里面会包含拧动好几次),都会打印日志:
1.png

日志中的魔方是按照“上面、后面的镜像、左面、前面、右面、下面”顺序摆放的。
如果某个块的颜色和当前面的颜色一样了,就用圆圈表示。
代码结构

2.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册