解魔方算法/Thislethwaite解魔方算法/降群法

0.前言

主流的魔方解法,从入门的层先法,到进阶的CFOP、桥式乃至盲拧,都是从部分到整体的思路,逐块逐层还原魔方。但是Thislethwaite法不同,Thislethwaite法从整体出发,不断降低魔方的混乱程度,最终达到的可以轻松复原的效果。Thislethwaite法又简称TM法、降群法。

1.魔方基础知识

需要了解的知识有:魔方状态表示法/魔方状态字符串/解魔方步骤字符串

1.1魔方各面表示

根据魔方各面所处位置将三阶魔方六个面分别用六个大写英文字母进行表示,相应面上的颜色也分别用这六个大写英文字母进行表示。

魔方六个面对应的大写英文字母及颜色

顶面Up

底面Down

前面Front

背面Back

左面Left

右面Right

UDFBLR
白色黄色绿色蓝色橙色红色

1.2 组成魔方的小方块

        一个三阶魔方可分为三层,顶层、底层和中间层。有六个面,每个面9个色块,一共54个色块。总共由26个小方块组成,根据魔方每个小方块所处的位置可分为三种小方块,分别是中心块、棱块和角块。中心块有6个,每个中心块上只有一种颜色,只需用一个大写字母表示,魔方在旋转过程中中心块的相对位置都是不会变的。棱块有12个,棱块处于每条边的中间位置,每个棱块有两种颜色,用两个大写字母表示。角块有8个,每个角块3种颜色,用三个大写字母表示。

1.3 魔方状态字符串

        可以用一串大写英文字母表示一个三阶魔方的状态,一个已经还原好的魔方可以用这样一串字符表示:UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR。

        这种表示法是由一个叫Mike Reid的魔方爱好者首先使用的,它表示一个已经被解好的魔方。因为六个不同颜色中心块在任何旋转过程中相对位置都是不会变的,所以没有单个字符。这串标准字符中12个双字符表示魔方的12个棱块,每个棱块两种颜色。8个三字符表示魔方8个角块,每个角块三种颜色。对照这个标准字符串,一个打乱的魔方的两个中心块所夹的棱块可以表示出来,三个中心块所夹的角块可以表示出来。

不理解的朋友还可以看看这篇博客:解魔方的机器人攻略18 – 魔方快速算法 at 做做AI,造造人 - 动力老男孩的博客

1.4 拧魔方动作表示/解魔方步骤字符串

        拧魔方的动作用各个魔方面代表的字符加顺时针旋转的次数表示,如R1表示R面即右面顺时针旋转一次,R2表示R面顺时针旋转两次,R3代表R面顺时针旋转三次,也即逆时针旋转1次。

        解魔方步骤字符串:U1D3F2L3B3F3U1L1D1L2U1F2R3U3B2L2U3F2U1F2L2F2D2L2B2D2L2U2F2U2

2.Thislethwaite算法/降群法

普通解法是通过逐块(by piece or block or layer)还原来减少下一步剩余块的排列数,最后所有块还原。Thistlethwaite方法则与此有本质的不同。魔方的任何一种块排列状态与魔方群的群元素是一一对应的。Thistlethwaite方法的思想就是逐步降解魔方所处的群到更小的子群,最后到单位子群,也即还原状态。所以在还原的每一步实体魔方看起来还是乱的,但实际上状态数是随所处的群的减小而规则的减小的。考虑到有些朋友不熟悉群论的语言,我就加个形象点的解释帮助理解。如果魔方通过<U,D,L,R,F,B>六个基本动作打乱,那么它的混乱状态可以达到最大,有10^20次方种。但假如我只用<U2,D2,L2,R2,F2,B2>来打乱魔方,显然魔方没有前一种情况乱,只有60万种。极端一点的,我只用R转动打乱魔方,那么魔方就只有四种混乱状态。上面这个逐步降解到子群的过程,就是把魔方由最大打乱状态一步一步的变到更小的打乱状态,最后达到复原状态。

这个表是魔方在相应子群时的状态数:

子群组合数

G0=<U,D,L,R,F,B>

4.33*10^19

Phase 1:G0->G1

G1=<U,D,L,R,F2,B2>

2.11*10^16

Phase 2:G1->G2

G2=<U,D,L2,R2,F2,B2>

1.95*10^10

Phase 3:G2->G3

G3=<U2,D2,L2,R2,F2,B2>

6.63*10^5

Phase 4:G3->G4

G4=<I>

1

有兴趣的朋友可以学习用降群法解三阶魔方,更好的理解降群法和群论。

相关降群法解魔方网站: Thistlethwaite's 52-move algorithm

3.基于降群法的C++程序

该程序是从这个网站下载的 CubeContest Winners

我选择的是第二位pochmann写的C++程序,我在VS2017上运行,下载后需要修改才能运行,程序输入的是魔方状态字符串,输出的是解魔方步骤字符串。我分享下我修改后的给大家,文件中还有降群法介绍和使用降群法解魔方教程。

网盘链接:https://pan.baidu.com/s/1ppfP1Rn81X0W8l2CYPFZZQ      提取码:3wxt 

CSDN链接:https://download.csdn.net/download/qq_42053235/14956295

在主函数main.c中修改乱序魔方状态字符串,运行后输出一串解魔方步骤字符串和运行程序时间。

需要根据实际魔方状态修改魔方状态字符串   argv = { "UF","DB","UB","UL","BR","DF","FR","UR","DR","FL","DL","BL", "RBU","DBR","UBL","ULF","RFD","UFR","LDF","BDL" };   //乱序的魔方状态表示

4.验证生成的解魔方步骤的正确性

本人编写了魔方动态还原过程仿真MATLAB程序,手头没有魔方的朋友可以试试,对着解魔方步骤手拧魔方也容易出错,仿真非常方便,对照我写的文章看看和下载程序。

文章:魔方二维动态还原过程MATLAB仿真/魔方二维平面展开_魔方还原程序_嗑药的皮皮虾的博客-CSDN博客

想做解魔方机器人的朋友可以看看别人的文章:Category Archive for ‘解魔方机器人’ at 做做AI,造造人 - 动力老男孩的博客

我本人也做了一个解魔方机器人,有空写文章分享给大家。

咸鱼号皮皮虾控制MATLAB

  • 10
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗑药的皮皮虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值