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

实现了一个三阶魔方的层先法求解程序:https://github.com/davelet/java-puzzle-resolver

欢迎试用。


用法

1. 随机试用

不关注起始状态的话可以用程序的随机拧乱工具打乱然后复原:

java 复制代码
    private Cube cube;

    private CubeSolver cubeSolver;
    private CubeShuffler cubeShuffler;

    @BeforeEach
    void setUp() {
        cube = new Cube();
        cubeSolver = new CubeSolver(cube);
        cubeShuffler = new CubeShuffler(cube);
    }
	
    @Test
    void solve_ExecuteBottomCornerSolver() {
            // 打乱魔方,随机拧20次
            cubeShuffler.shuffle(20);
            // 执行测试
            cubeSolver.solve();
            // 验证结果
            assertTrue(cube.isSolved());
    }

2. 特定状态的求解

要把状态初始化成某个特定状态,可以使用Cube的构造器:

java 复制代码
public class Cube implements Cloneable {
    private final Color[][][] state;

    public Cube() {
        state = new Color[6][SIZE][SIZE];
        initializeCube();
    }

// 使用这个方法传入一个三维数组
    public Cube(Color[][][] state) {
        this.state = state;
        if (!isValid()) {
            throw new IllegalArgumentException("提供的状态不是有效的魔方状态");
        }
    }
	// ...其他代码
	
}

状态是一个三维数组,维度分别是某个面、某一行、某一列。所以面做多6个(0~5),行和列做多3个。

数组的元素是 Color 枚举对象:

java 复制代码
public enum Color {
    WHITE("白", "\u001B[37m"),
    YELLOW("黄", "\u001B[33m"),
    RED("红", "\u001B[31m"),
    ORANGE("橙", "\u001B[38;5;208m"),
    BLUE("蓝", "\u001B[34m"),
    GREEN("绿", "\u001B[32m");
	// ...
}

特别要注意的是,这里要求市场标准魔方且不能转动魔方的方向

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

求解

层先法的逻辑毕竟简单清晰。但是我实现过程中也查了非常多资料,因为不同博客对层先法的过程说得不一样,尤其是顶层还原的时候。

而且我要实现的是求解过程不转动魔方方向,只拧某一层。很多资料都让上下颠倒魔方,或者找一个目标块放到左(右)手边。

求解过程每次拧动魔方(执行一套公式,里面会包含拧动好几次),都会打印日志:

日志中的魔方是按照"上面、后面的镜像、左面、前面、右面、下面"顺序摆放的。

如果某个块的颜色和当前面的颜色一样了,就用圆圈表示。

代码结构

相关推荐
艾伦_耶格宇9 小时前
【kubernetes - 1.28版本】-11 K8S核心组件
java·容器·kubernetes
2301_780789669 小时前
深度伪造即服务:新型网络诈骗的“完美面具”与识别之道
java·网络·ddos
LHICOD9 小时前
Linux-2
java·linux·后端·jar·vmware·svm·vm
香蕉大香蕉(06敬畏市场)9 小时前
MySQL 单点详解(03)
java·数据库·mysql·面试·八股·大厂实习
呆呆敲代码的小Y10 小时前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
水无痕simon10 小时前
3、工程重构
java·spring cloud·重构
阿里云基础软件10 小时前
Agent 任务提速 10.71%,内存占用降低 21.60%|Alibaba Cloud Linux 4 重大发布
java·linux·人工智能·操作系统·agent
Wang's Blog11 小时前
Java 项目实战: 交友项目 - 项目:需求分析与滑动数据设计
java·开发语言·交友
前端 贾公子11 小时前
第 5 章:Codex 从可运行程序到可交付工具
java·前端·数据库
CoderYanger11 小时前
Java EE 进阶:5. Spring IoC&DI(第三弹):Spring DI
java·开发语言·spring boot·spring·面试·java-ee·mvc