主要介紹:漢諾塔是什么,漢諾塔的規(guī)律,如何用C語(yǔ)言來(lái)實(shí)現(xiàn)漢諾塔👀。
??漢諾塔(Tower of Hanoi),又稱河內(nèi)塔。源自印度古老傳說(shuō)的一個(gè)游戲,大梵天創(chuàng)造世界的時(shí)候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動(dòng)一個(gè)圓盤。
??若每次移動(dòng)需要1s的時(shí)間,那么請(qǐng)問婆羅門需要多久才能把這64片黃金圓盤從一根石柱上移動(dòng)到另一個(gè)石柱上?
??若只有1個(gè)圓盤時(shí),需要移動(dòng)1次;若有2個(gè)圓盤時(shí),需要移動(dòng)3次;若有3個(gè)圓盤時(shí),需要移動(dòng)7次……不難看出,漢諾塔步數(shù)的數(shù)學(xué)規(guī)律為2的n次方減1(n為柱子上的圓盤個(gè)數(shù))。所以若有64個(gè)圓盤那將會(huì)移動(dòng)2^64-1次(即:18,446,744,073,709,551,615?次),若每次移動(dòng)需要1s時(shí)間,則需要將近5849億年的時(shí)間才能夠做到??梢姶箬筇煊卸嗪奁帕_門,這絕對(duì)是在坑人?。。?!
??現(xiàn)有三個(gè)柱子A、B、C,其中有n個(gè)圓盤在A柱上,最終要實(shí)現(xiàn)把這n個(gè)圓盤從A柱借助B柱移動(dòng)到C柱上。實(shí)現(xiàn)實(shí)現(xiàn)思路:先將n-1個(gè)圓盤從A柱移動(dòng)到B柱上,然后將A柱上最后一個(gè)圓盤移動(dòng)到C柱上,最后再把B柱上的n-1個(gè)圓盤移動(dòng)到C柱上。如下圖所示:
當(dāng)n=1時(shí):
1.將A柱上最后一個(gè)圓盤移動(dòng)到C柱上(A →C)
當(dāng)n=2時(shí):
1.將1個(gè)圓盤從A柱移動(dòng)到B柱上,重復(fù)n=1時(shí)的步驟,只不過是將那1個(gè)圓盤(從A借助于B移動(dòng)到C)改為(從A借助于C移動(dòng)到B)
2.將A柱上最后一個(gè)圓盤移動(dòng)到C柱上(A →C)
3.將B柱上的1個(gè)圓盤移動(dòng)到C柱上。重復(fù)n=1時(shí)的步驟,只不過是將那個(gè)圓盤(從A借助于B移動(dòng)到C)改為(從B借助于A移動(dòng)到C)
當(dāng)n=3時(shí):
1.將2個(gè)圓盤從A柱移動(dòng)到B柱上。重復(fù)n=2時(shí)的步驟,只不過是將那2個(gè)圓盤(從A借助于B移動(dòng)到C)改為(從A借助于C移動(dòng)到B)
2.將A柱上最后一個(gè)圓盤移動(dòng)到C柱上(A →C)
3.將B柱上的2個(gè)圓盤移動(dòng)到C柱上。重復(fù)n=2時(shí)的步驟,只不過是將那2個(gè)圓盤(從A借助于B移動(dòng)到C)改為(從B借助于A移動(dòng)到C)
當(dāng)n=4時(shí):
1.將3個(gè)圓盤從A柱移動(dòng)到B柱上。重復(fù)n=3時(shí)的步驟,只不過是將那3個(gè)圓盤(從A借助于B移動(dòng)到C)改為(從A借助于C移動(dòng)到B)
2.將A柱上最后一個(gè)圓盤移動(dòng)到C柱上(A →C)
3.將B柱上的3個(gè)圓盤移動(dòng)到C柱上。重復(fù)n=3時(shí)的步驟,只不過是將那3個(gè)圓盤(從A借助于B移動(dòng)到C)改為(從B借助于A移動(dòng)到C)
以此類推,當(dāng)漢諾塔上的圓盤數(shù)為n個(gè)時(shí)該如何移動(dòng),只需要按照上面的規(guī)律一直往上遞歸,最終是可以達(dá)到目的的。程序如下:
#includevoid move(char A, char C, int n)
{printf("把第%d個(gè)圓盤從%c--->%c\n", n, A, C);
}
void HanoiTower(char A, char B, char C, int n)
{if (n == 1)
{move(A, C, n);
}
else
{//將n-1個(gè)圓盤從A柱借助于C柱移動(dòng)到B柱上
HanoiTower(A, C, B, n - 1);
//將A柱子最后一個(gè)圓盤移動(dòng)到C柱上
move(A, C, n);
//將n-1個(gè)圓盤從B柱借助于A柱移動(dòng)到C柱上
HanoiTower(B, A, C, n - 1);
}
}
int main()
{int n = 0;
printf("輸入A柱子上的圓盤個(gè)數(shù):");
scanf("%d", &n);
//將n個(gè)圓盤從A柱借助于B柱移動(dòng)到C柱上
HanoiTower('A', 'B', 'C', n);
return 0;
}
??若想知道一共移動(dòng)了多少次圓盤,只需要在move()函數(shù)中加一個(gè)全局變量來(lái)統(tǒng)計(jì)個(gè)數(shù)就行。
這份博客👍如果對(duì)你有幫助,給博主一個(gè)免費(fèi)的點(diǎn)贊以示鼓勵(lì)歡迎各位🔎點(diǎn)贊👍評(píng)論收藏??,謝謝?。?!
如果有什么疑問或不同的見解,歡迎評(píng)論區(qū)留言歐👀。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧