zoukankan      html  css  js  c++  java
  • Alex Fung魔方解法学习记

    我学了Alex Fung魔方解法(见Solving the Rubik's Cube Systematically,这是一种精确的数学法,且是一种思路,一个系统解决方案,一种原理,不用死记硬背公式。

    这是一篇学习记,所有用到的算法动画演示见原文Java Applet。整个过程我录了视频演示(详见附录一)。
     
    魔方基础的术语(如图示,见Background and Naming of the Parts):前Front后Back左Left右Right上Up下Down面,顺(Clockwise,即我看着魔方的这一面顺时针转)逆(逆时针),本解法还用到中间层C,即左中右之中(C的方向随R);还用到腰层M,上下之间的夹层(M的方向随U)。固定三面朝我,三面看不见的式样,左手转前面Front(F面,我Fancy的左手),右手转右面Right(R面,我Right的右手)。
     
     
    Fung解法像个全集,本文的过程是一个子集:先底面再顶四角,顶三棱后棱对齐,中间层的棱和中间层的心。
    Fung解法的整体思路是:先角后棱再中心,先转位置再转面。具体来说,(1)先底4角,再顶4角;(2)然后底三棱,顶三棱,最后顶和底两棱,得到两面正确;(3)中间层的棱;(4)最后中心。每一步骤都是先把那一块转到那个位置去(动作是move),先不管方向(orientation),然后再转方向:角拧转(twist),楞翻转(flip)。
    1)先底面
    以黄底面为例,四条黄棱先转到对面(我的魔方是紫色),再任意旋转,使得棱的侧面正确,例如黄蓝块,旋转至蓝色面,再转回黄底。四角最后一招均使用CM1转法(见Moving Corners),这CM1操作是角操作的基础。不能因为我太会转齐一面了,就不用CM1,Fung解法是一个精确的数学乐高,CM1是基础块。

    X•Y•X-1 是一个conjugate(参考Design Theory),X,Y为魔方的转动操作,可以是单个操作或复合操作,但数学集合术语完全适用,例如X为F(左手顺时针转90度),X-1表示F-1(左手逆时针转90度);•表示动作相连,可省略,写在这里仅仅为了当动作为复合操作时,看起来清晰。

    conjugate的特点是逆为中间的动作的逆:(X•Y•X-1)-1=X•Y-1•X-1

    X•Y•X-1•Y-1是一个commutator,记为[X, Y],其特点是逆为两个转动操作相同但先后次序反之:(X•Y•X-1•Y-1)-1 = (Y•X•Y-1•X-1) = [Y, X]。

    CM1包括左手和右手的操作,有CM1R,CM1R-1,CM1F,CM1F-1
    CM1R = R-1•D-1•R        目标角在FRD,面朝右,右手操作。直觉:右手合,如图示。
    CM1F = F•D•F-1           与CM1R左右镜像,左手合

    CM1R-1 = (CM1R)-1=R-1•D•R     目标角在FRU,面朝左,右手操作,将其转到FRD,面朝左。直觉:右手开。
    CM1F-1 = F•D-1•F-1         与CM1R-1左右镜像,左手开

     
     
      
    转完是常见的底面白色,侧面T字。
     
    2)再顶四角
    转位置转面。转位置用CM3R,转面用CT2(CM3R和CT2见Moving Corners)。

    CM3R = [CM1R, U] = CM1R•U•CM1R-1•U-1  三角顺时针轮换,仅改变三个角的位置,直觉:三角轮换

     
    转位置,有两种情况:
    (i)一边两角对换。顶面用R逆,先将一角转正,剩下三角再对换,另两角的正确没意义,换句话说,三角轮换中包含有两角相对位置正确。有时候,我一看就是一个天然的三角对换,其实我得承认,那是凑巧,我不用亲自做“R逆”这一步了。
    (ii)顶角对换,先用一次CM3R,将情况变成(i),再用一次CM3R。
     
    关于转面,例如转黄面,有三种情况:
    (i)两角的黄色面一个朝前,一个朝后,那就按示例做CT2,先右手再左手。
    (ii)如果两角的黄色面同边都朝右,也是CT2,但镜像,先左手再右手。
    (iii)如果对角黄色面朝上,另两角不对,也是一个CT2,但是要转180度。
    重点是当操作成对时,后一个操作可以将前一个操作对其他块的伤害复原。
    有时,一个角朝向正确,剩下三个角朝向不对,拆作两组CT2,但中间的那一块在第一个CT2中要假装它的朝向是配对的。
    CT1 = CM1R-1•CM1F          目标角在FRU,面朝左,先右手CM1R-1将其转到FRD,面朝左,再左手CM1F,转到FRU,面朝上。直觉:右手开左手合。

    CT1-1=CM1F-1•CM1R          与CT1左右镜像

    CT2 = [CT1, U] = CT1•U•CT1-1•U-1    目标角位置正确,面朝向不对。成对的镜像操作。仅改变两个角的面朝向。直觉:两角翻面
     
    CM3R和CT2是成功的秘诀,因为其他块都不动。如果把魔方转齐了,在一面尝试CM3R和CT2,转完了,发现除了目标块(CM3R三块、CT2两块)有变动,其他块毫发无伤。
     
    3)顶三棱后棱对齐
    这一步转对位置的同时,方向也是对的。
    EM1BR和EM1BL是将侧边棱转到顶的两个基础操作(见Moving Edges Part I)。
    当顶的一条棱调整时,直下的底的棱也变了(EM1BR变成顶棱,EM1BL是背后看不见的那条棱),于是变成底三棱。每转一条棱,确保下面的棱是那个不对的棱,是个buffer,是我们不关注的buffer。

    EM1BR = [F, M] = F•M•F-1•M-1      直觉:前腰回回

    EM1BR-1 = [M, F] = M•F•M-1•F-1     直觉:腰前回回
    EM1BL = [F-1, M2] = F-1•M2•F•M2     直觉:后腰腰回回

    EM1BL-1 = [M2, F-1] =M2• F-1•M2•F   直觉:腰腰后回回

     
        
    最后一步“上下两条棱同时拧正”(见Moving Edges Part II),这一步是所有步骤中的最难的,是个关卡。(我一开始偷偷用过左手镜像操作。)
    写我的方法:目标底棱在顶面(底面朝左),目标顶棱在侧面,用EM1BR。
    F面的竖着的两条棱在操作中不变,可在一开始找到符合EM1BR的那个棱,暂存于此处。若最后不幸下棱正确、上棱位置对朝向不对,三步纠正:1)将上棱用EM1BL拧下来,存于FR棱,2)再将下棱EM1BL拧到上棱,3)再用EM1BR。
    若已经能转齐六面,观察EM1BR和EM1BL,观察上下两条棱在这两个操作下去哪儿了,可有更多技巧。
     
    这样两面整齐,将魔方像是三明治那样立起来,我们来调整混乱的夹层。
     
    4)中间层的棱和中间层的心
    转位置,有两种情况:
    (i)一棱位置正确,三棱轮换:三棱轮换EM3(见Moving Edges Part II),当发现两棱需对换的情况,先顺转90度(C),铆定一个,剩下三棱轮换,原理同顶四角。
    (ii)两棱对角交换:两次EM3。
     EM3 = [U2, C-1] = U2C-1U2
     
    此时看一下,如果中心不对,可以先转中心。我遇到的情况都是两对中心直线对换,NM4(见Completing the Cube)。有一次我看到所有块都好了,只有中心不对,Wow,但是NM4这个转法,四两拨千斤,too good to be true。 
     NM4 = [C, M2] = C•M2•C-1•M2
    棱转面用EF2B(见Moving Edges Part I):将两个棱成对翻转,用的是EM1BR和EM1BL两个操作的正逆组合。
    有两种情况:
    (i) 两棱在同一面,显然是直线相对的,不是像演示的,转90度,而是转180度。这种情况用一次EF2B。
    (ii) 两棱在对角线上,用两次EF2B,第一次EF2B时,过渡的中间块反而要拧反。
    这个操作显然是“王牌”了,如同穿过桃花岛。我到了这最后一步重头再来的情况不计其数,真是气炸了。后来我口中念念有词:一二三四五六七八(EF1B),一二三四五六七八(EF1B-1)。刚才先转中心也只是为了不添迷惑,第一个八拍走完,乱相是每一面两块或三块。

    EF1B = EM1BR-1•EM1BL =  [M, F]•[F-1, M2] = (M•F•M-1•F-1)•(F-1•M2•F•M2)   直觉:腰前回回 前腰回回(一二三四五六七八)

    EF1B-1 = EM1BL-1•EM1BR = [M2, F-1]•[F, M] = (M2•F-1•M2•F)•(F•M•F-1•M-1)    直觉:腰腰后回回 后腰腰回回(一二三四五六七八,“腰腰”算一步)
    EF2B = [EF1B, U2] = EF1B•U2•EF1B-1•U2          第二个操作是:一个次序相反的EM1BL,接一个正常的EM1BR

     
    Alex Fung说这个算法是他二十多年前写成博客,文中说他十多年不转魔方,一旦转起来,照样能转好,不像记公式,一段时间不转,就不会转了。这句话直接说中我的痛处。经过了这些月,我深感这个方法的迷人实用。关于Fung解法有反馈的话,请写邮件给他。
     
    后来,我转异形魔方,意识到Fung解法需要与经典解法结合(详见附录二)。
     
     
    附录一:Alex Fung魔方解法视频

    1)三阶魔方视频
    Alex Fung魔方解法整体介绍、第一层十字架:0~2:10秒
    第一层的角、基础动作左手合、左手开、右手合、右手开:2:10~7:10秒
    顶层三角轮换:7:10~11:50秒
    顶层两角换面:11:50~16:17秒
    顶层四棱、前腰回回、后腰腰回回:16:17~22:26秒
    中间层三棱轮换:另一个视频
    中间层中心对换:22:26~24:35秒
    中间层两棱换面:24:35~末尾

    2)两阶魔方视频

    附录二:Fung解法与经典解法的结合

    Fung解法适用于其他异形魔方,例如二阶、四阶、镜面等,但在五魔方中,中间层不能转,若用上下层相对旋转的方法,我还没能尝试。

    经典的“先第一层、后第二层、再第三层”魔方解法中,关于第二层棱如何拧对,“魔方小站站长”使用“远切回回、接孩子回家”算法,但新浪博主“震我一下魔方宅”将其拆解为两个“上钩下回”动作。

    左手上钩下回=(魔方上下颠倒后)右手合+底回  即,(经典)F-1•U-1•F•U=(Fung解法魔方上下颠倒后)R-1•D-1•R•D=[R-1, D-1]

    右手上钩下回=(魔方上下颠倒后)左手合+底回  即,(经典)R•U•R-1•U-1=(Fung解法魔方上下颠倒后) F•D•F-1F•D-1=[F, D]

    故,第二层棱拧对的解法“远切回回、接孩子回家”=(Fung解法中魔方上下颠倒后)远+右手合+底回+左手合+底回。或,镜面动作。

    三阶魔方“震我一下魔方宅”君调整顶层棱十字架以及位置也使用上钩下回的动作组合。但五魔方的顶层调整棱的位置依然用到魔方小站站长教的“小鱼一”和“小鱼二”。

    再有,三阶粽子魔方很难。难点在于:
    (1)乱且歪,其三阶魔方的架构要齐平视野,看出横平竖直的井字格。井字格的对准很费眼力,固有手势的手感难以使出来,过程中扭曲尖锐丑陋的外观让人很不自信。
    (2)双色中心块对应三阶魔方的中心,其位置有方位性,比三阶魔方严格,每走一步要加格外步骤校准。对齐第一层门槛很高。第一层先棱后角,需要逐块谨慎处理。
    (3)顶层十字架难以识别面向。
     
    为了直觉上更好理解,以及解决五魔方、三阶粽子魔方,我将Fung解法与经典解法结合,新的解决方案为:
    1)第一层:Fung解法
    2)第二层:棱用上钩下回
    3)第三层:先十字架,用上钩下回;后十字架位置,用小鱼;再角,用Fung解法。
     
     
  • 相关阅读:
    HTML学习笔记
    "IIS无法启动"问题解决方法
    NET访问MySQl数据库中文乱码解决
    珍爱生命,远离肥胖,远离过劳死
    Bcp 命令注意事项
    阿里云万郁香:多样付费选择构筑成本最优的弹性体验
    性能提升40%!阿里云神龙大数据加速引擎获TPCxBB世界排名第一
    阿里云王志坤:强劲可靠、无处不在的云,为创新保驾护航
    发现新视界——视觉计算将如何改变生产方式
    Soul运维总监尤首智:企业如何从0到1建设云上运维体系
  • 原文地址:https://www.cnblogs.com/dersu/p/6872738.html
Copyright © 2011-2022 走看看