九连环算法--《计算机程序设计艺术》
以前回復(fù)一個(gè)關(guān)于9連環(huán)解法的問(wèn)題,看過(guò)《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》的人都知道,這個(gè)問(wèn)題的是中國(guó)的古老游戲,其解法就是“格雷二進(jìn)制”的描述。
?九連環(huán)是一種傳統(tǒng)的中國(guó)玩具,它有九個(gè)連在一起的環(huán)河一根長(zhǎng)棒組成。一開(kāi)始,九個(gè)環(huán)都裝在榜上,由于其特殊的構(gòu)造,只能按以下規(guī)則從棒上取下或裝上環(huán):
1)所有環(huán)只能從棒的一端取下。將環(huán)按距離這一端的遠(yuǎn)近從近到遠(yuǎn)依次編號(hào)為1~9號(hào)環(huán)。無(wú)論知名移動(dòng)環(huán),環(huán)的順序都不會(huì)改變
2)1號(hào)環(huán)隨時(shí)可以取下或裝上
3)當(dāng)K-1(K=2-9)號(hào)之前的環(huán)(不包含K-1號(hào)環(huán))全部被取下,K-1號(hào)環(huán)還在棒上時(shí),可將K號(hào)環(huán)取下或裝上
已有以下兩個(gè)函數(shù)
UpOne(int idx);//裝上某個(gè)序號(hào)的環(huán)(無(wú)法裝上時(shí)不會(huì)有動(dòng)作)
DownOne(int idx);//卸下某個(gè)序號(hào)的環(huán)(無(wú)法卸下時(shí)不會(huì)有動(dòng)作)
請(qǐng)寫(xiě)出裝上和卸下全部環(huán)的函數(shù),并且將具體實(shí)現(xiàn)的C#代碼寫(xiě)出(需用控制臺(tái)輸出)
?
有很多網(wǎng)友提出了各種不同的解決方案,也不乏寫(xiě)了大篇代碼的。
其實(shí)這個(gè)問(wèn)題說(shuō)起來(lái)很簡(jiǎn)單,下面是我的解決方案
這個(gè)問(wèn)題上帝已經(jīng)解決把公式描述出來(lái)了,是格雷二進(jìn)制編碼的問(wèn)題,大師的名字就叫高納德.克努特?
公式就是
T0=空
Tn+1="0"+Tn,"1"+Tn的逆?
參考<<計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) 第四卷 第二冊(cè)>>
比如
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?
...
依次類(lèi)推 T9=...
這個(gè)組合里包含了所有的可能性,注意到按這個(gè)方法形成的組合無(wú)論往左還是往右,都只有一個(gè)位變化了? 比如
“000,001,011,010,110,111,101,100?”:000->001->011->010-110->111->101-100,每一步都只變化了一位
如果是3連環(huán)的話(huà),將環(huán)套上的順序是
000,001,011,010,110,111
環(huán)取下的順序正好相反?
要判斷在每個(gè)狀態(tài)下具體一個(gè)環(huán)是否能套上,則判斷該狀態(tài)右邊的值是否與該環(huán)對(duì)應(yīng)的值不同?
要判斷在每個(gè)狀態(tài)下具體一個(gè)環(huán)是否能取下,則判斷該狀態(tài)左邊的值是否與該環(huán)對(duì)應(yīng)的值不同?
算法就是這樣,是否能套上,就把T(N)預(yù)先計(jì)算出來(lái),然后逐個(gè)對(duì)比就OK
轉(zhuǎn)載于:https://www.cnblogs.com/stst/p/4909734.html
總結(jié)
以上是生活随笔為你收集整理的九连环算法--《计算机程序设计艺术》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: spring_如何在Spring Boo
- 下一篇: 华为刷机-回退版本升级