拾光绘卷
2025-09-09 16:58:21
来自版块:三国煮酒这个想法只是看到这个活动一下子想到的组数基本问题,实际上可以不去追求最小步数,只是觉得有意思
如果要追求最少的步数,不是一行一行随便换是最少的(当然也有可能初始的状态比较背
最少步数 = “错位排列”的最优换位次数问题。
当操作是“任意两块一次”时,最小步数只取决于当前排列相对于目标排列的置换循环分解:
核心结论
把 16 块的当前顺序看成目标顺序的一个置换,将这个置换 分解成若干个不相交的循环 (长度为1的循环表示那块已在正确位置)。
最少步数 = 12 - 循环数(包括长度为1的循环)。
原理
假设有一个长度为 12 的拼图🧩,即长度为12的整体不相交。这表示:位置 x1 上放着 x2 的块,位置 x2 上放着 x3,…,位置 x12上放着 x1。
• 第一步:把应该在 x1 的元素换到 x1。这样 x1 就正确了。
• 剩下 11个元素仍然错位。
• 每做一次就能再固定一个位置。
• 最终需要 11次,循环才能全部复原。
所以,一个循环长度为 l的循环,最少需要 l-1 次
同时一个排列可以分解为若干个不相交的循环,每个循环不干扰。
最优操作怎么做
对每个长度为 l>1 的循环,任选一个“基准位置”,把应在该位置的那块过来;此举会把该循环长度减少 1。重复 l-1 次就能把这一循环全部就位。对所有循环进行即可。
这样做能达到上面的下界,因此是最优的。
简单例子
假设分解后得到循环长度:(5), (3), (2), (2), (1), (1), (1), (1)(总共 8 个循环)。
最少步数 = (5-1)+(3-1)+(2-1)+(2-1)=4+2+1+1=8,也等于 16-8=8。
小贴士
1. 给每块标上“原始编号”(按目标图从左到右、从上到下编号 1–12)。
2. 读出当前布局对应的“去往位置”的映射,做循环分解。
3. 按循环依次用“把正确块换到位”的方法执行,每个循环用l-1#三国杀将星筑梦 #拾光绘卷 #互关、互赞、互推