原子之心顏色圓盤鎖的快速解密方法

今天擼了一把原子之心,解密部分還蠻有意思的,遇到幾次顏色圓盤鎖,簡單的還好,復(fù)雜點的花了十分鐘還解不出來 ╮(╯▽╰)╭,特別是兩種顏色以上的。
后來我想了一下,這個解密過程其實可以抽象成算法問題。圓盤上有一個內(nèi)圈,其中包含8個圓,每個圓里可能有一種顏色,也可能沒有顏色。因此,我們可以用一個長度為8的數(shù)組來表示這個內(nèi)圈,不同的顏色可以用不同的整數(shù)來表示。例如,0表示沒有顏色,1表示黃色,2表示藍色,以此類推,不會超過8種顏色。
我們假設(shè)數(shù)組第一個元素對應(yīng)12點方向的顏色,按順時針走,得到一個初始狀態(tài)。同樣的,我們的目標狀態(tài)是外圈的順時針數(shù)組。比如下面這張圖, 假設(shè)3表示紅色,則:
初試狀態(tài)是 3 0 0 0 0 0 1 3
目標狀態(tài)是 0 3 1 0 0 0 3 0

一個狀態(tài)只有三種方式轉(zhuǎn)移到下一個狀態(tài),數(shù)組向左移2,數(shù)組向右移2,或者數(shù)組的第4到第6個元素自身右移1。所以,整個解密過程相當于找一個從初始狀態(tài)到目標狀態(tài)的最短路徑,而狀態(tài)的每一步轉(zhuǎn)移代價相同,所以相當于在邊權(quán)都為1的有向圖上找兩點之間的最短路,并打印出來。?所以我立刻想到用dfs來實現(xiàn)這個解密過程。(當然,bfs更好,因為少了遞歸調(diào)用棧的使用。)
Anyway, 基于此我快速寫了個基于dfs的命令行的demo,用哈希表和一些判斷做剪枝優(yōu)化,最后將最短路徑映射到PS5手柄按鍵序列并打印出來。比如圖中的其中一個最短路徑解法是:
L2 X X R2 X L2 X X R2 X L2

Demo已經(jīng)開源到? https://github.com/H-Shen/DotsLockCracker ,由于時間緊迫沒來的做CICD,歡迎提issue。如果需要支持其他平臺 比如PC,則將源碼鍵盤映射部分改成對應(yīng)平臺的游戲按鍵再重新構(gòu)建就行了。