【C语言】汉诺塔问题
漢諾(Hanoi)塔問題:假設(shè)有命名為A、B、C的三個(gè)塔柱,初始時(shí),在塔柱A上插有n個(gè)直徑大小各不相同的圓盤,從上往下,圓盤從小到大編號(hào)為1、2、3、···n,要求將A柱上的圓盤移至塔柱C,可借助塔柱B,用程序模擬搬盤子過程。本程序要求用非遞歸算法的程序?qū)崿F(xiàn) (n<=6)。 圓盤移動(dòng)必須遵守下列規(guī)則: 1:每次只能移動(dòng)一個(gè)圓盤; 2:圓盤可以插在任意一個(gè)塔柱上; 3:任何時(shí)刻都不能將一個(gè)較大的圓盤放在一個(gè)較小的圓盤上。
輸入格式:
正整數(shù)n。
輸出格式:
搬盤子過程,每行一次搬動(dòng)。
輸入樣例:
3輸出樣例:
A->C A->B C->B A->C B->A B->C A->C代碼如下:
#include <stdio.h> #include <stdlib.h> //Hanoi void Hanoi(int n, char A, char B, char C);int main() {//設(shè)立盤子個(gè)數(shù)int n = 0;//輸入盤子個(gè)數(shù)scanf("%d",&n);//遞歸函數(shù)Hanoi(n,'A','B','C');//傳入ABC三個(gè)柱子 A:起始位置 B:經(jīng)過位置 C:最終位置return 0; }//move void move(char x, char y) {//x:起始位置 y:終止位置printf("%c->%c\n",x, y); }//Hanoi void Hanoi(int n, char A, char B, char C) {//處理一個(gè)盤子if(n == 1) {move(A, C);}//處理n-1個(gè)盤子else {Hanoi(n - 1, A, C, B);//第一步將n-1個(gè)盤子從A經(jīng)過C移到Bmove(A, C);//第二步將剩余盤子從A移到CHanoi(n - 1, B, A, C);//第三步將n-1個(gè)盤子從B經(jīng)過A移到C}}核心關(guān)鍵
作者:Fireman A
鏈接:https://www.zhihu.com/question/24385418/answer/257751077
來源:知乎
對(duì)遞歸的理解的要點(diǎn)主要在于放棄!
放棄你對(duì)于理解和跟蹤遞歸全程的企圖,只理解遞歸兩層之間的交接,以及遞歸終結(jié)的條件。
想象你來到某個(gè)熱帶叢林,意外發(fā)現(xiàn)了十層之高的漢諾塔。正當(dāng)你苦苦思索如何搬動(dòng)它時(shí),林中出來一個(gè)土著,毛遂自薦要幫你搬塔。他名叫二傻,戴著一個(gè)草帽,草帽上有一個(gè)2字,號(hào)稱會(huì)把一到二號(hào)盤搬到任意柱。
你靈機(jī)一動(dòng),問道:“你該不會(huì)有個(gè)兄弟叫三傻吧?”
“對(duì)對(duì),老爺你咋知道的?他會(huì)搬一到三號(hào)盤。“
”那你去把他叫來,我不需要你了。“
于是三傻來了,他也帶著個(gè)草帽,上面有個(gè)3字。
你說:”三傻,你幫我把頭三個(gè)盤子移到c柱吧。“
三傻沉吟了一會(huì),走進(jìn)樹林,你聽見他大叫:”二傻,出來幫我把頭兩個(gè)盤子搬到C!“
由于天氣炎熱你開始打瞌睡。朦朧中你沒看見二傻是怎么工作的,二傻干完以后,走入林中大叫一聲:“老三,我干完了!”
三傻出來,把三號(hào)盤從A搬到B,然后又去叫二傻:“老二,幫我把頭兩個(gè)盤子搬回A!”
余下的我就不多說了,總之三傻其實(shí)只搬三號(hào)盤,其他叫二傻出來干。最后一步是三傻把三號(hào)盤搬到C,然后呼叫二傻來把頭兩個(gè)盤子搬回C
事情完了之后你把三傻叫來,對(duì)他說:“其實(shí)你不知道怎么具體一步一步把三個(gè)盤子搬到C,是吧?”
三傻不解地說:“我不是把任務(wù)干完了?”
你說:“可你其實(shí)叫你兄弟二傻干了大部分工作呀?”
三傻說:“我外包給他和你屁相干?”
你問到:“二傻是不是也外包給了誰?“
三傻笑了:“這跟我有屁相干?”
你苦苦思索了一夜,第二天,你走入林中大叫:“十傻,你在哪?”
一個(gè)頭上帶著10號(hào)草帽的人,十傻,應(yīng)聲而出:“老爺,你有什么事?”
“我要你幫把1到10號(hào)盤子搬到C柱“
“好的,老爺。“十傻轉(zhuǎn)身就向林內(nèi)走。
“慢著,你該不是回去叫你兄弟九傻吧“
“老爺你怎么知道的?“
“所以你使喚他把頭九個(gè)盤子搬過來搬過去,你只要搬幾次十號(hào)盤就好了,對(duì)嗎?“
“對(duì)呀!“
“你知不知道他是怎么干的?“
“這和我有屁相干?“
你嘆了一口氣,決定放棄。十傻開始干活。樹林里充滿了此起彼伏的叫聲:“九傻,來一下!“ “老八,到你了!““五傻!。。。“”三傻!。。。“”大傻!“
你注意到大傻從不叫人,但是大傻的工作也最簡單,他只是把一號(hào)盤搬來搬去。
若干年后,工作結(jié)束了。十傻來到你面前。你問十傻:“是誰教給你們這么干活的?“
十傻說:“我爸爸。他給我留了這張紙條。”
他從口袋里掏出一張小紙條,上面寫著:“照你帽子的號(hào)碼搬盤子到目標(biāo)柱。如果有盤子壓住你,叫你上面一位哥哥把他搬走。如果有盤子占住你要去的柱子,叫你哥哥把它搬到不礙事的地方。等你的盤子搬到了目標(biāo),叫你哥哥把該壓在你上面的盤子搬回到你上頭。“
你不解地問:“那大傻沒有哥哥怎么辦?“
十傻笑了:“他只管一號(hào)盤,所以永遠(yuǎn)不會(huì)碰到那兩個(gè)‘如果’,也沒有盤子該壓在一號(hào)上啊。”
但這時(shí)他忽然變了顏色,好像泄漏了巨大的機(jī)密。他驚慌地看了你一眼,飛快地逃入樹林。
第二天,你到樹林里去搜尋這十兄弟。他們已經(jīng)不知去向。你找到了一個(gè)小屋,只容一個(gè)人居住,但是屋里有十頂草帽,寫著一到十號(hào)的號(hào)碼。
總結(jié)
以上是生活随笔為你收集整理的【C语言】汉诺塔问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2010教师师德学习心得体会
- 下一篇: 计算机教师继续教育心得,教师继续教育心得