原子之心颜色圆盘锁的快速解密方法
2023-02-26 06:12 作者:1CNiEkJAY5_YJC6 | 我要投稿

今天撸了一把原子之心,解密部分还蛮有意思的,遇到几次颜色圆盘锁,简单的还好,复杂点的花了十分钟还解不出来 ╮(╯▽╰)╭,特别是两种颜色以上的。
后来我想了一下,这个解密过程其实可以抽象成算法问题。圆盘上有一个内圈,其中包含8个圆,每个圆里可能有一种颜色,也可能没有颜色。因此,我们可以用一个长度为8的数组来表示这个内圈,不同的颜色可以用不同的整数来表示。例如,0表示没有颜色,1表示黄色,2表示蓝色,以此类推,不会超过8种颜色。
我们假设数组第一个元素对应12点方向的颜色,按顺时针走,得到一个初始状态。同样的,我们的目标状态是外圈的顺时针数组。比如下面这张图, 假设3表示红色,则:
初试状态是 3 0 0 0 0 0 1 3
目标状态是 0 3 1 0 0 0 3 0

一个状态只有三种方式转移到下一个状态,数组向左移2,数组向右移2,或者数组的第4到第6个元素自身右移1。所以,整个解密过程相当于找一个从初始状态到目标状态的最短路径,而状态的每一步转移代价相同,所以相当于在边权都为1的有向图上找两点之间的最短路,并打印出来。 所以我立刻想到用dfs来实现这个解密过程。(当然,bfs更好,因为少了递归调用栈的使用。)
Anyway, 基于此我快速写了个基于dfs的命令行的demo,用哈希表和一些判断做剪枝优化,最后将最短路径映射到PS5手柄按键序列并打印出来。比如图中的其中一个最短路径解法是:
L2 X X R2 X L2 X X R2 X L2

Demo已经开源到 https://github.com/H-Shen/DotsLockCracker ,由于时间紧迫没来的做CICD,欢迎提issue。如果需要支持其他平台 比如PC,则将源码键盘映射部分改成对应平台的游戏按键再重新构建就行了。