1樓:匿名使用者
漢諾塔問題
問題:首先去掉原來的神話色彩:神廟、僧侶和世界末日,來到問題的數學本質。
有a、b、c三根柱子。a上堆放了n個盤子,每個盤子都比它下面的盤子小一些。現在要把盤子全部搬到c上去,條件是每次只能搬動一個盤子,而且任何時候都不能放在比它小的盤子上面(顯然,必須用到b作為中轉)。
怎麼搬動這些盤子呢?
解決:玩一下這個遊戲,很快就會發現,想把n個盤子搬到c,必須先把上面的n-1個盤子搬到b,然後把第n個盤子搬到c,最後再把n-1個盤子搬過來。整個過程是這樣的:
1,把上面的n-1個盤子從a搬到b,以c作為中轉;
2,把第n個盤子從a搬到c;
3,把n-1個盤子從b搬到c,以a作為中轉。
也就是說,要解決n個盤子的問題,先要解決n-1個盤子的問題。而這個問題與前一個是類似的,可以用相同的辦法解決。最終,我們會來到只有一個盤子的情況,很簡單,直接把盤子從a搬到c即可。
通過以上分析可以寫出:
void hanoi (int n, char src, char mid, char dst)}
2樓:匿名使用者
簡單的說,通過的方法就是:若手中需要挪動的塔(由大到小順序排列)為奇數個,就將第一個塔(最小的)移到目標格;若手中需要挪動的塔為偶數個,就將第一個塔移到剩餘的那格 塔數多時分步挪動(先移兩層,再至三層四層……) 最少步數為2的n次方再減1
漢諾塔問題,為什麼程式這樣寫,請解釋一下 50
3樓:聽不清啊
當只有一個盤子的時候,只需要從將a塔上的一個盤子移到c塔上。
當a塔上有兩個盤子是,先將a塔上的1號盤子(編號從上到下)移動到b塔上,再將a塔上的2號盤子移動的c塔上,最後將b塔上的小盤子移動到c塔上。
當a塔上有3個盤子時,先將a塔上編號1至2的盤子(共2個)移動到b塔上(需藉助c塔),然後將a塔上的3號最大的盤子移動到c塔,最後將b塔上的兩個盤子藉助a塔移動到c塔上。
當a塔上有n個盤子是,先將a塔上編號1至n-1的盤子(共n-1個)移動到b塔上(藉助c塔),然後將a塔上最大的n號盤子移動到c塔上,最後將b塔上的n-1個盤子藉助a塔移動到c塔上。
綜上所述,除了只有一個盤子時不需要藉助其他塔外,其餘情況均一樣(只是事件的複雜程度不一樣)。
#include
//第一個塔為初始塔,中間的塔為借用塔,最後一個塔為目標塔
int i=1;//記錄步數
void move(int n,char from,char to) //將編號為n的盤子由from移動到to
{printf("第%d步:將%d號盤子%c---->%c\n",i++,n,from,to);
void hanoi(int n,char from,char denpend_on,char to)
//將n個盤子,由初始塔,利用借用塔,移動到目標塔
if (n==1)
move(1,from,to);//只有一個盤子是直接將初塔上的盤子移動到目的地
else
hanoi(n-1,from,to,denpend_on);//先將初始塔的前n-1個盤子藉助目的塔移動到借用塔上
move(n,from,to); //將剩下的一個盤子移動到目的塔上
hanoi(n-1,denpend_on,from,to);//最後將借用塔上的n-1個盤子移動到目的塔上
void main()
printf("請輸入盤子的個數:\n");
int n;
scanf("%d",&n);
char x='a',y='b',z='c';
printf("盤子移動情況如下:\n");
hanoi(n,x,y,z);
計算機資料結構的一道題: 漢諾塔問題:前提是隻有3個金盤,麻煩給詳細解釋一下這段**:
4樓:匿名使用者
我和你一樣,對漢諾塔一直搞不懂,但是有天上課,狠下心,安靜的想想,然後自己代入數字去算,終於搞懂了...那就按3個金盤分析吧。
在one塔上,有三個盤,假設它是從大到小排列的(最下面的盤最大),並把盤移至three塔上,在這裡,two塔是作為一個輔助塔的作用。
首先解釋形參與實參:當n=2時,執行else hanoi(n-1,one,three,two);這句語句是呼叫函式自身,至於為什麼順序是one,three,two,是因為原理中要把除最後一個盤全部移至two盤中,而hanoi(n-1,one,three,two);在這句語句中,one,three,two是實參,但是在主函式體中void hanoi(int n,char one,char two,char three)宣告的是形參,所以,在下面if(n==1) move (one,three);其實就相當if(n==1) move (one,two);即將one塔的第一個盤移至two塔!這樣也就符合原理了!
好,基本原理已經明白了,下面開始程式執行步驟,我把程式執行時執行的語句一句一句寫出來解釋,剛試著解釋n=3的情況,但是當n=3時,有18個步驟,越解釋你會越糊塗的,所以建議解釋n=2哈,其實知道n=2,自己想著3的執行步驟一步一步來就會了:
void hanoi(int 2,char one,char two,char three)//主函式
{void move(char x,char y);
if(n==1) //判斷n,n=2,所以執行else
else
hanoi(2-1,one,three,two); //這個語句即呼叫自身,所以要從頭部看下來,但是注意傳遞的實參,為了方便區分,該函式為函式1
//現在開始執行函式1
if(n==1) //此時n=1,所以不執行else
move (one,three); //將第一個盤移至two塔,為什麼是two呢,因為前面呼叫自身的時候,順序是one,three,two,實際上此時three是指向two的。
//函式1執行完畢,繼續執行主函式,即move(one,three);
move(one,three); //將第二盤移至three,此時是主函式,所以three指的就是three
hanoi(n-1,two,one,three);這個語句即呼叫自身,該函式為函式2
//現在開始執行函式2
if(n==1) //此時n=1,所以不執行else
move (one,three); //將第二個盤移從two塔移至three,為什麼呢,因為前面呼叫自身的時候,順序是two,one,three,實際上此時one是指向two的,three依然是指向three的。
//函式2執行完畢
//主函式也執行完畢
所以移動的順序是,將1盤移至two塔,然後將2盤移至three塔,最後將
1盤,從two塔移至three。完成!
其實,仔細分析一下,n=3就出來了,關鍵在於要相信自己,一步一步來,注意區分實參和形參!
你一定可以的,要是還是沒明白可以hi我!望採納...寫了很久~
5樓:
這不是遞迴呼叫嗎?就是呼叫自己,但是每次呼叫的資料在有變化啊!
6樓:匿名使用者
這個演算法是錯的。
void move(int n , char x, char y)void hannoi(int n, char a, char b, char c)
else
}原理是:
abc三個塔,初始是都在a上,結果要在b上。
如果只有一個的化,就直接方到b上。
不然就把a上面到都方到c上,
把最大的一個方到b上,
把放到c上到在都放到b上。就ok
c語言漢諾塔問題,C語言漢諾塔問題
關於漢諾塔這個東西是相當的抽象,我當時學習的時候看了好幾個版本的教程,也沒有搞懂,最後還是自己反覆的理解,頓悟了,所以我這裡把當時我作為初學者的想法寫給你,但是最重要的還得靠你自己的理解 1 對於void hanoi int n,char one char two,char three 這個函式,表...
c語言漢諾塔程式,C語言漢諾塔程式
將以下內容全部複製到新建的原始檔中 本人自己寫的,因為你那課本上的 沒解釋,書寫不規範,很難理解清楚,所以我直接新寫了一個完整的 附帶詳細說明 include 漢諾塔x層塔從a塔整體搬到c塔,中間臨時b塔。x層塔是從大到小往上疊放。每次移動只能移動一層塔。並且在移動過程中必須保證小層在上邊 藉助b塔...
漢諾塔的問題柱子,如果塔的個數變位abcd
c語言 include using namespace std void move char a,char b cout if 1 n move a,d else if 2 n move a,b move a,d move b,d else hannuo n 2,a,c,d,b move a,c m...