九连环算法--《计算机程序设计艺术》
以前回復一個關于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
轉載于:https://www.cnblogs.com/stst/p/4909734.html
總結
以上是生活随笔為你收集整理的九连环算法--《计算机程序设计艺术》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring_如何在Spring Boo
- 下一篇: 华为刷机-回退版本升级