• 九连环算法--《计算机程序设计艺术》


    以前回复一个关于9连环解法的问题,看过《计算机程序设计艺术》的人都知道,这个问题的是中国的古老游戏,其解法就是“格雷二进制”的描述。

     九连环是一种传统的中国玩具,它有九个连在一起的环河一根长棒组成。一开始,九个环都装在榜上,由于其特殊的构造,只能按以下规则从棒上取下或装上环:

    1)所有环只能从棒的一端取下。将环按距离这一端的远近从近到远依次编号为1~9号环。无论知名移动环,环的顺序都不会改变

    2)1号环随时可以取下或装上

    3)当K-1(K=2-9)号之前的环(不包含K-1号环)全部被取下,K-1号环还在棒上时,可将K号环取下或装上
    已有以下两个函数

    UpOne(int idx);//装上某个序号的环(无法装上时不会有动作)

    DownOne(int idx);//卸下某个序号的环(无法卸下时不会有动作)
    请写出装上和卸下全部环的函数,并且将具体实现的C#代码写出(需用控制台输出)

    有很多网友提出了各种不同的解决方案,也不乏写了大篇代码的。

    其实这个问题说起来很简单,下面是我的解决方案

    这个问题上帝已经解决把公式描述出来了,是格雷二进制编码的问题,大师的名字就叫高纳德.克努特 

    公式就是

    T0=空

    Tn+1="0"+Tn,"1"+Tn的逆 

    参考<<计算机程序设计艺术 第四卷 第二册>>

    比如

    T0=空

    T1={0,1} 

    T2=0{0,1},1{1,0}=00,01,11,10 

    T3=0{00,01,11,10},1{10,11,01,00}  =000,001,011,010,110,111,101,100 

    ...

    依次类推 T9=...

    这个组合里包含了所有的可能性,注意到按这个方法形成的组合无论往左还是往右,都只有一个位变化了  比如

    “000,001,011,010,110,111,101,100 ”:000->001->011->010-110->111->101-100,每一步都只变化了一位

    如果是3连环的话,将环套上的顺序是

    000,001,011,010,110,111

    环取下的顺序正好相反 

    要判断在每个状态下具体一个环是否能套上,则判断该状态右边的值是否与该环对应的值不同 

    要判断在每个状态下具体一个环是否能取下,则判断该状态左边的值是否与该环对应的值不同 

    算法就是这样,是否能套上,就把T(N)预先计算出来,然后逐个对比就OK

  • 相关阅读:
    第二周学习进度总结
    《大道至简》阅读收获及个人总结
    代码层面解释安全性
    2020年大三下学期第二周学习心得
    信息化领域热词分类分析及解释实战
    2020年新型冠状病毒疫情分析实战
    《架构漫谈》个人理解概括
    北京市信件内容爬虫实例——首都之窗
    2020寒假生活学习日记(十五)
    2020寒假生活学习日记(十四)
  • 原文地址:https://www.cnblogs.com/stst/p/4909734.html
Copyright © 2020-2023  润新知