Alex Fung魔方转法学习记

我学了Alex Fung魔方转法,这是一种精确的数学法,且是一种思路,一个系统解决方案,一种原理,不用死记硬背公式。

这是一篇学习记,所有用到的算法必须去原文查看具体的数学公式和Java Applet的演示。因为我还不会编程演示,所以本文不self-contained,而像是一个数学课抄录的笔记,只是记录我的学习过程。

首先,请拿纸和笔——数学公式必须自己写一遍,自己推导一遍,使得自己看到那些符号,心里不发怵,所以写只是为了变得信任眼熟亲切记得。

魔方基础的令人讨厌气噎眼花缭乱终于整个头脑都拧巴了的术语还得学:前Front后Back左Left右Right上Up下Down面,顺(Clockwise,即我看着魔方的这一面顺时针转)逆(逆时针),比如底面逆,我就把魔方举得高过头看它,那个逆时针。学魔方要老老实实、很僵硬,如果一上来就翻来翻去,会晕过去的。要当它有西瓜那么大,悬空固定在那里,就是那个三面朝我,三面看不见的固定式样(如下图),左手转前面Front,右手转右面Right。其实实际操作起来就是左手右手,但是和左面右面混淆了,为了精确,数学公式使用严格的术语F面(我Fancy的左手)、R面(我Right的右手)。

让这些术语做为将头脑拧成魔方的热身。

其次,请把下列数学书一页一页地点开摊好,可以直接看,直接一步一步练习,也可以先跳过,按照我记录的过程往下走,遇到数学公式返回去查找公式和演示。公式在我的电脑上显示为乱码,Fung说是因为文章写成于20多年前,Windows的编码乱了,需要用自己的话在纸上改写。例如:CT1 º CM1R-1ÅCM1F,改成CT1 = (CM1R-1)(CM1F)。

Solving the Rubik‘s Cube Systematically

Fung解法的整体思路是:先角后棱再中心,先转位置再转面。具体来说,(1)先底4角,再顶4角;(2)然后底三棱,顶三棱,最后顶和底两棱,得到两面正确;(3)中间层的棱;(4)最后中心。每一步骤都是先把那一块转到那个位置去(动作是move),先不管方向(orientation),然后再转方向:角拧转(twist),楞翻转(flip)。

Fung解法像个全集,我的过程是一个子集。

1)底面先转齐。请用白底面,向Fung解法看齐,使用CM1和CT1两个转法(见Moving Corners),CM1用于转位置,CT1用于转面。这两个操作是角操作的基础。不能因为我太会转齐一面了,就自己转,不,这是一个精确的数学乐高,CM1和CT1是基础块。

2)再转顶四角,先转位置再转面。转位置用CM3,转面用CT2。

两角对换,有两种情况:

(i)同边两角对换。顶面用R逆,先将一角转正,剩下三角再对换,另两角的正确没意义,换句话说,三角轮换中包含有两角相对位置正确。有时候,我一看就是一个天然的三角对换,其实我得承认,那是凑巧,我不用亲自做“R逆”这一步了。

(ii)对角两角对换,先用一次CM3,将情况变成(i),再用一次CM3。

关于转面,例如转黄面,有三种情况,(i)两角的黄色面一个冲前,一个冲后,那就按示例做CT2,先右手再左手,妥妥的。(ii)如果两角的黄色面同边都冲右,也是CT2,但镜像,先左手再右手。(iii)如果一角黄色面朝上,一角黄色面朝右,也是CT2,但做完了,有一个角对了,有一个角还得跟剩下的一个角做CT2。

CM3和CT2是成功的秘诀,因为其他块都不动。如果您已经会把下两层转齐,那么在顶面尝试了颇为复杂高断的CM3和CT2,转完了,发现下两层毫发无伤,那场面真是很吓人的。

3)然后顶三棱。

这一步转对位置的同时,方面也是对的,见Moving Edges Part I

EM1BR和EM1BL是将侧边棱转到顶的两个基础操作,简记为R,BL。我非得自己再添乱搞出新术语吗?因为后面有个棱转面的操作(EF2D),用的是这两个操作的正逆组合,那个操作耗掉了我一天一夜不止,在头脑里渐渐清晰,也渐渐产生这个简记法。

当顶的一条棱调整时,直下的底的棱也变了(EM1BR是顶棱,EM1BL是背后看不见的那条棱),于是变成底三棱。每转一条棱,确保下面的棱是那个不对的棱,是个buffer,是我们不关注的buffer。

最后上下两条棱同时拧正(EM1BR是顶棱,EM1BL是背后看不见的那条棱),此时目标底棱在顶面,目标顶棱在侧面。(如果您在这里不停地失败,我只好幸灾乐祸,到底还是掉坑里去了——这里是有技术含量的,而且我感觉我还没彻底弄清楚。)

这样两面整齐,将魔方像是三明治那样立起来,我们来调整混乱的夹层。

4)中间四棱。

转位置:三棱轮换EM3,当发现两棱需对换的情况,先转90度,铆钉一个,剩下三棱轮换,原理同顶四角。

两对棱直线对换EM4。我确实用到一次,但其他时候都用EM3。

转面用EF2D:R逆,BL,U,BL逆,R,U逆。用到上面说的箭记法了,写出来才短短这么一行乱码,做起来是大汗淋漓、废寝费事、青面獠牙、日月星辰早已变换。

5)最后中心调整。

两对:直线对换CM2C-1M2,或者拐弯对换CMC-1M。当我看到所有块都好了,只有中心不对时,真是看到怪物了,但是这个转法,四两拨千斤,too good to be true。

最后说一个错觉:我转齐底面,就节约了很多步骤,那我先不浪费我的经验(那我也是费了心血的呀),先转齐两层,那不得更快?

我先用蛮力转齐下两层,顶面用CM3,CT2这种环保法。第一次运气好,棱位置对,只需要两棱翻面,但其他时候棱位置不对,则一点没节约,还把转好的中间层弄得乱七八糟,搞得我很心痛,我感觉那个运气好的概率好像买彩票的,故曰:错觉。

Alex Fung说他十多年不转魔方,一旦转起来,照样能转好,不像记公式,一段时间不转,就不会转了。这句话直接说中我的痛处。待时日,我确认一下总能转出来。

In the honor of Alex Fung, 关于Fung解法有反馈的话,可以直接写邮件给他,他的个人网页有联系方式。

时间: 2024-10-24 08:17:44

Alex Fung魔方转法学习记的相关文章

扩展欧几里得算法学习记

话说以前我刷noip题的时候就想学这个东西了,结果却一直拖到了现在…… 到了高二才会这种东西的我实在是个蒟蒻啊! 将扩展欧几里得算法之前,先讲讲欧几里得算法是什么:gcd(a,b)=gcd(b,a%b).很显然是不?但我们还是要给出证明(设r=a%b): 设x是a,b的一个公约数,由于存在k使得a=k*b+r,又由于a|x,b|x,则有r|x,所以x是b,r的公约数 设x是b,r的一个公约数,因为存在k使得a=k*b+r,且b|x,r|x,那么a|x,所以x是a,b的公约数 综上所述,a和b的所

C#数字图像处理算法学习笔记(一)--C#图像处理的3中方法

C#数字图像处理算法学习笔记(一)--C#图像处理的3中方法 Bitmap类:此类封装了GDI+中的一个位图,次位图有图形图像及其属性的像素数据组成.因此此类是用于处理像素数据定义的图形的对象.该类的主要方法和属性如下:  GetPixel与SetPixel方法:获取或设置一个图像的指定像素的颜色. PixelFormat属性:返回图像的像素格式. Height和Width:返回图像的高度和宽度. LockBits与UnLockBits方法:分别锁定和解锁系统内存中的位图像素. LockBits

C#数字图像处理算法学习笔记(三)--图像几何变换

C#数字图像处理算法学习笔记(三)--图像几何变换 几何图像处理包括 图像的平移变换,镜像变换,旋转变换,伸缩变换,在这里仅以水平镜像为例,通过代码来理解其基本操作方式: 翻转前: 翻转后: //后台代码: public partial class Form1 : Form { private string _curFileName; private Bitmap _srcBitmap; private Bitmap _dstBitmap; public Form1() { Initialize

C#数字图像处理算法学习笔记(二)--点运算与直方图

C#数字图像处理算法学习笔记(二)--点运算与直方图 在数字图像处理中,点运算是一种简单而重要的技术.点运算只是根据对象的像素的输入灰度值来决定像素的输出灰度值的图像处理运算.它有时也被称为对比度增强.对比度拉伸或灰度变换.点运算没有改变图像的空间运算,它是按照一定的方式改变了图像的灰度直方图. 灰度直方图是一种最简单且最有用的工具,它概括了一幅图像的灰度级内容. 灰度直方图的定义: 灰度直方图是灰度的函数,描述的是图像中的具有该灰度级的像素个数.如果用直角坐标系来表示,则它的横坐标是灰度级,纵

构建之法学习总结(1)

构建之法学习总结(1) 从刚开始的自主学习过程再到暑期的开发实践,粗略一算也有一个学期多了,这段时间内收益匪浅.<现代软件工程>这门软件开发的基础课程,说实话这类概念型教材是很枯燥的,但邹老师编写的这本<构建之法>一书给读者带来了更多趣味性,简单易懂,是一本很好的软件工程书. 这本教材对于初学者来说是非常适合的,易懂且涉及全面,软件开发所涉及的方面和方法都有包括在内. 第一章 概论,讲述了软件工程的相关基础概念,为大家解答了软件以及软件工程到底是什么:软件工程和计算机科学的关系:源

软工学习记1

这学期,我们分了方向,专业方向.也许向老师说的那样学习好的选了计科,我大概属于学习差的吧.高中的紧绷让我到了大学不知道该干嘛了,荒废了整个大一,到现在还不知道自己读了大学学会了干什么.现在我要追赶了,毕竟差的不是一点半点.分了方向,有了任务,也大概自导自己该干嘛了.开始感觉还是挺无从下手的,不过信心还是有的.也算亡羊补牢吧. 这俩星期自己抽空看了看这本构建之法.粗略明白了点要想开发一个堪称完美的软件是十分困难的.需要大量人力时间.软件等于程序加软件工程,软件开发的阶段不同,我们所需要的标准花费的

统计学习方法 (第3章)K近邻法 学习笔记

第3章 K近邻法 k近邻算法简单.直观:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类.当K=1时,又称为最近邻算法,这时候就是将训练数据集中与x最邻近点作为x的类. 3.1 k近邻模型 模型由三个基本要素--距离度量.k值得选择.和分类决策规则决定. 3.1.1 距离度量 p=2时,称为欧式距离,p=1时,称为曼哈顿距离. 3.1.2 k值的选择 k 值的选择会对k 近邻法的结果产生重大影响.如果选择较小的k

构建之法学习(第一章 概论)

初读邹欣老师的<构建之法>,却发现并没有像其它大多数软件工程教材一样偏重理论知识,而是大量引用实例,将实践与理论相结合,一改原本的空洞.乏味,反而更多的是趣味性. 通过对于第一章的自我学习,总结了一些知识点: 1.软件=程序+软件工程 程序=数据结构+算法    程序,就是指的源程序,是可执行代码.软件构建,构建成机器能懂的可执行代码,要有合理的软件架构,软件设计与实现,还要有各种文件和数据来描述各个程序文件之间的依赖关系,编译参数,链接参数等等. 软件工程是把系统的.有序的.可量化的方法应用

构建之法学习(5)

本周学习的是构建之法第五章 团队和流程 团队有共同的特点:1. 团队有一致的集体目标,团队要一起完成这目标.一个团队的成员不一定要同时工作,例如接力赛跑.(王屋村搬砖的"非团队"成员则不然,每个人想搬多少就搬多少,不想干了就结算工钱走人.)2. 团队成员有各自的分工,互相依赖合作,共同完成任务.(王屋村搬砖的"非团队"成员则是各自行动,独立把任务完成,有人不辞而别,对其他的搬砖人无实质影响.)