0.前言

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

1.魔方基础知识

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

1.1魔方各面表示

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

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

顶面Up

底面Down

前面Front

背面Back

左面Left

右面Right

U D F B L R
白色 黄色 绿色 蓝色 橙色 红色

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个角块,每个角块三种颜色。对照这个标准字符串,一个打乱的魔方的两个中心块所夹的棱块可以表示出来,三个中心块所夹的角块可以表示出来。

不理解的朋友还可以看看这篇博客:http://www.diy-robots.com/?p=282

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

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

相关降群法解魔方网站: https://www.jaapsch.net/puzzles/thistle.htm

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

该程序是从这个网站下载的 https://tomas.rokicki.com/cubecontest/winners.html

我选择的是第二位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程序,手头没有魔方的朋友可以试试,对着解魔方步骤手拧魔方也容易出错,仿真非常方便,对照我写的文章看看和下载程序。

文章:https://blog.csdn.net/qq_42053235/article/details/113398226

想做解魔方机器人的朋友可以看看别人的文章:http://www.diy-robots.com/?cat=3

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

解魔方算法/Thislethwaite解魔方算法/降群法相关推荐

  1. 用降群的方法来解算还原魔方的步骤C++

    本文为我在做魔方机器人时用到的解算魔方的算法,参考了德国的Stefan Pochmann写的C++算法和网上找的一些降群的知识,对他的算法进行了理解和按照自己的需要进行了改动.以下给出这部分代码的源码 ...

  2. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  3. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  4. prim算法_贪心算法详解(附例题)

    贪心算法的特征规律 贪心算法,"贪心"二字顾名思义,因此其规律特征就是更加注重当前的状态,贪心法做出的选择是对于当前所处状态的最优选择,它的解决问题的视角是微观的"局部& ...

  5. Union-Find 并查集算法详解

    Union-Find 并查集算法详解 文章目录 Union-Find 并查集算法详解 一.问题介绍 二.基本思路 三.平衡性优化 四.路径压缩 五.总结 六.例题 一.问题介绍 简单说,动态连通性其实 ...

  6. 字符串匹配之KMP算法详解

    kmp算法又称"看毛片"算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚. ...

  7. 模拟退火算法全解(Simulated Annealing)文末有源码

    模拟退火算法全解(Simulated Annealing) 文章目录 模拟退火算法全解(**Simulated Annealing**) 金属退火 算法机制 爬山算法 模拟退火 Metropolis准 ...

  8. SIFT特征点提取及描述论文算法详解

    SIFT特征点提取及描述论文算法详解 1. 尺度空间极值检测(Scale-space extrema detection) 1.1 尺度空间和极值 1.2 DoG和LoG的关系 1.3 构建高斯尺度差 ...

  9. 点云配准NDT (P2D)算法详解

    点云配准NDT (P2D)算法详解 最近了解了一些关于点云配准算法NDT的相关文章,进行总结一下. NDT算法的关键是其利用正态分布对参考点云进行了重新表示,使用点云在一个模型特定位置的似然值而不是直 ...

最新文章

  1. CSS改变nth-child()和nth-last-child()的参数灵活选择元素编号
  2. mysql 加入列,改动列,删除列。
  3. 服务器上安装n点虚拟主机,N点虚拟主机管理系统之①-运行N点
  4. python的turtle怎么设置rgb颜色_Python : turtle色彩控制实例详解
  5. 三十七、Sql 补充 | 数据库优化
  6. DELPHI获取网卡MAC地址 转
  7. 运行时间_运行一段时间报高压保护
  8. php钓鱼怎么使用方法,路亚钓法操作步骤及抛投技巧
  9. Oracle创建一个用户并赋予其他用户表的访问权限
  10. java 1.6 32位_JDK1.6 32位官方下载
  11. rk3568 android11 的 hardware架构学习纪要
  12. 搭建一个网站步骤 制作网页完整步骤
  13. 三国志战略版:四大阵营武将总结——魏国篇
  14. html文字抖动效果,CSS实现TikTok文字抖动效果示例
  15. 人物-物理学家:爱因斯坦
  16. 还在用QQ邮箱?教你如何创建自己的高逼格邮箱
  17. #459 津津有味:北方人对饺子的痴迷可能是刻进骨子里的
  18. dockerfile文件中copy上下文目录
  19. 微信美团支付服务器异常怎么回事,无法使用微信支付?美团回应:支付系统出现异常 已全面恢复...
  20. AIS(自动识别系统)介绍

热门文章

  1. 工作日志-2017年06月04日
  2. 蚂蚁金服简单的几道面试题目,却坑了90%程序员!
  3. 【单片机毕业设计】【mcuclub-jj-054】基于单片机的豆浆机的设计
  4. 微带线宽与承受功率的关系
  5. 笔记系列----逻辑备份和恢复 imp/exp/impdp/expdp
  6. Is there a way to enable UEFI support in KVM
  7. echart与百度地图实现省、市、县地图
  8. Excel VBA:删除行、列或单元格
  9. oracle数据库查看版本号
  10. 回顾“低代码”历史发展,是技术进步了还是倒退了?