解密内容分为两大部分:第一部分是确定图案的目标位置,主要通过数独完成;第二部分则是移动图案至目标位置的方法,涉及元素置换和二维二阶魔方的运用,实质是两个六阶置换群与一个八阶置换群的组合操作。
第一张图最少需要9步完成,其中4步用于交换位置,3步用于旋转;第二张图则需要12步,包括2步交换和10步旋转。其余部分解法相对简单,各人所花步数差距不大。
第一张图的操作流程(从左上角开始编号,第一个旋转中心设为a,第二个设为b)。
旋转:a
置换:(列表中每个位置的元素可与其余六个位置进行交换,顺序为从左至右、从上至下,0代表雪花,1代表太阳,2代表枫叶,3代表芽)
第二张图的详细操作步骤:
旋转:abcbbabacc
置换:[0,2],[2,0]
解:编写程序让电脑运行。
第一阶段:编写自动填充数独的脚本sudoku.py,用于确定图案的目标位置。
将游戏界面简化为一个嵌套列表,可移动的图案设为空格,不可移动的图案(包括被旋转或置换的)作为固定数字填入,旋转节点则视为断点,断点所在行左右不连续,所在列上下不连续,由此得到第一张图对应的数独结构。
[ ["$$" , None, None, None],
[None, "$$" , None, "$$" ],
[None, None, "$$" , None],
[None, None, None, None]
]
第二张图中的数独表格:
[ ["$$" , 2 , 1 , None, 3 ],
[0 , 3 , None , "$$" , None],
[None , None, "$$" , None, 2 ],
[None, "$$" , None, 3 , 0 ],
["$$" , None, None, 1 , "$$" ]
]
页面中存在大量空白,首张图中所有图案位置均不固定,此时运行sudoku.py程序可能会生成多个解答。
需考虑每个数字的大小范围、可用次数及其可能到达的位置均是确定的。
由于两张图数独中可填数字被划分为置换和旋转两个独立部分,因此需要分别进行讨论。
首先观察较为简单的图二,其中置换部分仅有两个空位,总共存在两种不同情况。分别分析这两种情形下的可能解,并结合游戏的初始状态进行判断。
[ ["$$" , 2 , 1 , None, 3 ],
[0 , 3 , None , "$$" , None],
[0 , None, "$$" , None, 2 ],
[None, "$$" , None, 3 , 0 ],
["$$" , None,2 , 1 , "$$" ]
]
下面无解,因此只需考虑
[["$$", 2, 1, None, 3],
[0, 3, None, "$$", None],
[2, None, "$$", None, 2],
[None, "$$", None, 3, 0],
["$$", None, 0, 1, "$$"]]
以此解作为输入,脚本输出了新的解。
Solution 1 :
$$ 2 1 0 3
0 3 2 $$ 1
2 1 $$ 0 2
3 $$ 2 3 0
$$ 3 0 1 $$
至此,图二中所有图案的目标位置都已明确。
再看第一张图,置换和旋转部分各有6个空位,表面看似相同。我怀疑是自己考虑得不够全面,导致出现这样的情况。由于对旋转部分更感兴趣,我决定先分析所有旋转的可能性,并编写了一个模拟二维魔方的程序2d.py来进行验证。
将二维魔方的初始状态设置为与游戏中的状态一致(matrix = , , ]),通过2d.py程序使用深度优先搜索(DFS)遍历所有可能的旋转操作,生成所有不同的旋转结果,最终得到60种不同的状态。将这些结果分别存入嵌套列表中,生成60个数独游戏界面。接着,调用自动解数独程序依次求解这60个数独表,筛选出所有可解的结果,最终获得28个有效解。由此,便得到了图一中所有图案可能对应的目标位置,共计28种情况。
第二阶段编写了用于计算不同移动方式所需最少步骤的程序,包括2dbfs.py和trsbfs,以便获取各类情况下的最优解。
图二的情况较为简单,其中所有图案仅对应一个目标位置。通过2dbfs遍历旋转部分,得出最短操作步数为10步,具体步骤为abcbbabacc。将这一部分与置换所需的两步交换相加,最终最少操作步数为12步。
在图一中,采用2dbfs方法对28种目标位置进行遍历,计算出其中24种旋转部分的最短操作步数,步数范围从1到7步不等(由于部分目标位置在旋转操作中存在多个解,因此实际涉及的旋转情况为24种)。接着使用trsbfs方法对这24种目标位置进行遍历,得出对应的最短置换操作步数,范围在4到6步之间。将两个结果按相同序号进行匹配,得到总步数的最小值为9步。
我没有考虑到使用雪花图案开门的情形,最多存在两步的误差。如果有高手对此感兴趣,可以在那24种最佳方案中,结合开门因素进一步计算出最终的最佳解法。
虽然我们已经找到了这个游戏的解法,但对于将来遇到类似旋转机制的谜题(可以称为二维魔方),如果不借助计算机,该如何手动解决?我们可以借助魔方中一个通用的操作原则,叫做上顺下逆。
举个例子,假设我们希望将数字4和3交换位置(记作 ->),此时我们有一个基本操作叫做上,它可以围绕这四个元素的中心进行旋转,使前四个位置的元素依次轮换(->)。同时,我们知道顺操作可以让当前集合中的第三个位置的元素与外部的某个元素进行交换(其中?代表任意数字)(->)。
下和逆分别是上和顺的反向操作,因此它们的作用也正好相反。当我们执行一次上的时候,确实能够将某个元素移动到目标位置,但与此同时,也破坏了另外三个我们希望保持不变的位置。接下来如果我们执行下,虽然可以恢复这三个位置,但也会把我们已经移动到位的那个元素又移回原处。
为了解决这个问题,我们可以在上和下之间插入一次顺操作,它的作用是将上之后已经到达目标位置的那个元素暂时移开。这样一来,下在恢复其他三个位置时就不会影响到它。等下完成之后,再执行一次逆,将之前移走的元素重新放回原位(->,->,->,->)。
也许有人会问,为什么不是 ->?这是因为这里的交换是基于固定位置之间的绝对坐标进行的,而不是直接交换两个特定的元素,我们关注的是位置(盒子),而不是位置中的内容(盒子里的东西)。
如果我们能找到一个合适的数字(例如3),在临时移动时能够替换到那个我们希望保留的位置,就能实现目标状态(->)。在图二所展示的二维魔方旋转机关中,这种思路同样适用。
[0 0
1 1
2 2
3 3]
bab可使2的空位被1的空位取代。
[2 0
0 1
1 2
3 3]
C能用2的空穴填补3的空缺。
[0 0
1 1
3 2
3 2]
于是(bab)c(bab)c,先让2移动到1的位置,3为保护1临时替代其位置,随后3回到原位,1再返回至2之前的位置。
[0 0
3 1
1 2
2 3]
如果已经掌握魔方公式,也可以直接套用其他魔方的解法思路。之所以称其为魔方,是因为它与魔方一样属于置换群结构,每次旋转90度都会进行一次四阶循环。称为二维是因为它每个角只对应一个面,区别于魔方的多个面;而二阶的命名则表明它是一个2×2的结构,相比三阶魔方缺少了中心块和棱块。
魔方的上顺下逆公式源自抽象代数中的交换子结构,形式为 ghgh,广泛应用于置换群的运算。图中展示的六个元素之间的两两交换本质上也是置换群的操作。尽管表面上有六个元素,但实际上仅包含四个不同元素。由于四阶置换可拆解为三个二阶置换,因此最多只需三次交换,即可实现这六个元素的所有排列组合。
虽然得到了一些不错的解答,但这款游戏我始终没太搞懂。首先,游戏的目标似乎不太明确,比如要求相连直线上不能有相同能量源,难道不应该是指每个元素所在的直线上都不存在相同能量源吗?另外,关于图二中的二阶魔方,它包含8个元素,可以通过旋转实现所有8个元素的不同排列;但图一中同样是二阶魔方,却只有6个元素,它们的旋转组合远远无法达到排列6个不同元素的所有可能性。希望有高手能帮忙解释清楚,如果有理解错误的地方,也欢迎指正,非常感谢。
第一张图的所有解法及魔方步骤计算程序下载地址为:39.106.13.71。
评论
更多评论