c語言遊戲漢諾塔的執行過程,C語言遊戲漢諾塔的執行過程!

2022-02-07 22:53:13 字數 5382 閱讀 6976

1樓:夏天的飛鳥

這樣寫我還沒有見過,感覺不怎麼樣,我見過一種寫法(偽**)假設初始狀態從左到右依次是柱bac,盤子在a上(順序其實無所謂),目標從a到c,即右移

n是盤子個數目,+1表示右移,如果到了已經在最右邊,直接迴圈到最左邊的;-1表示與此正好相反

偽**void hanoi(int n,int d)//d=1相當於把n-1個盤子(假如大小依次是123~n-1)左移到a,然後把最大的盤子(n)移動到c,然後n-1個盤子左移(迴圈到最右邊了),就ok了。

遞迴就是用計算機實現數學的數學歸納法。

2樓:匿名使用者

hanoi(n-1,a,c,b);

printf("%d->%d\n",a,c);

hanoi(n-1,b,a,c);

如樓上諸位所說,這三句的用處是:如果要將a上的n塊盤子移動到c,則先將上面的n-1塊移動到b,再將最下面的那塊(也是最大的)移動到c(printf這句的含義),然後將b上的n-1塊移動到c。而從b移動n-1塊到c的方法一樣,先移動上面的n-2塊到a,再將第二大的盤子移動到c,再將a上的n-2塊移動到c。

hanoi(n-1,b,a,c)會轉化成hanoi(n-2, b, c, a);printf("%d->%d\n", b, c);hanoi(n-2, a, b, c);這樣的三句(假設n-2>1)。

這裡用到一個基本思想,就是任何一個最大的盤子移到到c以後,就可以假設這個盤子自動消失了,c可視為空柱,需要解決的盤子由n個減少為n-1個。

3樓:匿名使用者

將n-1層漢諾塔由a通過c移到b,列印 a-> c ,再將n-1層漢諾塔由b通過a移到c

4樓:匿名使用者

hanoi(n-1,a,c,b)是說,將n-1個盤子從a移到b,

然後將最大的盤子移到c。

將n-1個盤子移到c座

c語言--漢諾塔程式執行步驟

5樓:

這個問題你要先把遞迴搞懂才能理解的, 最好是單跟蹤執行一下, 我這裡就簡單說一下吧!

hanoi(5, 'a', 'b', 'c');把5個從'a'移到'c'

這時n=5, noe='a', two='b', three='c'

因為n!=1, 執行else裡的

hanoi( 4, 'a', 'c', 'b'); //把上面4個從a移到b

move( 'a', 'c'); //把第5個從a移到c

hanoi( 4, 'b', 'a', 'c'); //再把那4個從b移到c

上面的很好明白的, 再分析hanoi( 4, 'a', 'c', 'b'); //把上面4個從a移到b,也是執行else

hanoi( 3, 'a', 'b', 'c'); //把上面3個從a移到c

move( 'a', 'b'); //把第4個從a移到b

hanoi( 4, 'c', 'a', 'b'); //再把那3個從c移到b

一直到n=1才結束

6樓:匿名使用者

用c語言編寫程式求漢諾塔的移動步驟

7樓:匿名使用者

#include

void move(char a,char b)void f(int n,char a,char b,char c)}void main()

這是我的** 前面的是定義一個函式 這裡遞迴體現在函式裡面還有函式 於是會一次又一次的計算 直到最後把n-1以前的都移到b,最下面的移到c,再把其他的從b移到c。。 無返回的話 應該是這裡用void 沒有return返回數值

8樓:匿名使用者

#include

using namespace std;

int main()

求真正理解漢諾塔問題的程式設計大神回答一下,當n=3時,用c語言編寫的漢諾塔遞迴呼叫**的詳細執行過程

9樓:汗會欣

/* 漢諾塔 hannota.c */

#include

/*解法:

如果柱子標為abc,要由a搬至c,在只有一個盤子時,就將它直接搬至c,當有兩個盤子,就將b當作輔助柱。

如果盤數超過2個,將第三個以下的盤子遮起來,就很簡單了,每次處理兩個盤子,也就是:a->b、a->c、b->c這三個步驟,而被遮住的部份,其實就是進入程式的遞迴處理。

事實上,若有n個盤子,則移動完畢所需之次數為2^n-1;

所以當盤數為64時,則 64所需次數為:2^63=8446744073709551615為5.05390248594782e+16年,

也就是約5000世紀,如果對這數字沒什么概念,就假設每秒鐘搬一個盤子好了,也要約5850億年左右

*/void hannota ( int n,char a,char b,char c )

else

}int main()

10樓:我愛上那女孩

一開始我接觸漢諾塔也是很不解,隨著**量的積累,現在很容易就看懂了,因此樓主主要還是對遞迴函式的理解不夠深刻,建議你多寫一些遞迴程式,熟練了自己就能理解。

圓盤邏輯移動過程+程式遞迴過程分析

hanoi塔問題, 演算法分析如下,設a上有n個盤子,為了便於理解我將n個盤子從上到下編號1-n,標記為盤子1,盤子2......盤子n。

如果n=1,則將「 圓盤1 」 從  a 直接移動到 c。

如果n=2,則:

(1)將a上的n-1(等於1)個圓盤移到b上,也就是把盤1移動到b上;

(2)再將a上 「盤2」 移到c上;

(3)最後將b上的n-1(等於1)個圓盤移到c上,也就是第(1)步中放在b上的盤1移動到c上。

注意:在這裡由於超過了1個盤子,因此不能直接把盤子從a移動到c上,要藉助b,那 麼 hanoi(n,one,two,three)的含義就是由n個盤子,從one移動到three,如果n>2 那麼就進行遞迴,如果n=1,那麼就直接移動。

具體流程:

hanoi(2,a,b,c);由於2>1因此進入了遞迴的環節中。

<1>執行hanoi(1,a,c,b):這裡就是剛才的步驟(1),代表藉助c柱子,將a柱子上的  1個圓盤(盤1)移動到b柱子,其實由於是n=1,此時c柱子並沒被用到,而是直接移動了。

<2>執行hanoi(1,a,b,c):這是步驟(2),藉助b柱子,將a柱子上的一個圓盤(盤2)移動到c柱子上。這裡由於也是n=1,也並沒有真正藉助b柱子,直接移動的。

<3>執行hanoi(1,b,a,c):這是步驟(3),將b上的一個盤子(盤1)移動到c

函式中由於每次呼叫hanoi的n值都是1,那麼都不會進入遞迴中,都是直接執行了mov移動函式。

如果n=3,則:(倒著想會想明白)移動的倒數第二部,必然是下面的情況

(1)將a上的n`-1(等於2)個圓盤移到c上,也就是將盤1、盤2 此時都在b柱子上,只有這樣才能移動最下面的盤子(盤3)。那麼由於現在我們先忽略的最大的盤子(盤3),那麼我們現在的目標就是,將兩個盤子(盤1、盤2)從a柱子上,藉助c柱  子,移動到b柱子上來,這個過程是上面n=2的時候的移動過程,n=2的移動過程是「2     個盤子,從柱子a,藉助柱子b,移動到柱子c」。現在是「2個盤子,從柱子a,藉助柱子 c,移動到柱子b上」。

因此移動過程直接呼叫n=2的移動過程就能實現。

(2)將a上的一個圓盤(盤3)移到c。

(3)到這一步,由於已經將最大的盤子(盤3)移動到了目的地,此時無論後面怎麼移動都不需要在用到最大的那個盤子(盤3),我們就先忽略他,剩下的目標就是將b上面的n-1個盤子(盤1、盤2)移動到c上,由於a上沒有盤子了,此時要完成上面的目標,就要藉助a盤子。最終達到的目標就是將b上的2個盤子,藉助a移動到c上,這個過程就是當n=2時分析的過程了,僅僅是最開始的柱子(b柱子)和被藉助的柱子(a柱子)不同了。所以直接呼叫n=2時候的過程就能股實現了。

具體執行過程:

hanoi(3,a,b,c);由於3>1因此進入了遞迴的環節中。

<1>執行hanoi(2,a,c,b):這裡代表剛才的步驟(1),將兩個盤子(盤1、盤2)從a移動到b,中間藉助c。根據n=2的分析過程,必然是能夠達到我們的目的。

<2>執行hanoi(1,a,b,c):現在a上只有一個盤子(盤3),直接移動到c上面即可。

<3>執行hanoi(2,b,a,c):此時對應步驟(3),剩下的目標就是將b上的兩個盤子,藉助a移動到c上。那麼同樣根據n=2的移動過程,必然能達到目的。

最終實現了3個盤子從a,藉助b移動到了c。

11樓:匿名使用者

理解漢諾塔問題,可以先拋開遞迴這件事,就問題本身來討論,先不要看程式。

三個柱子上,小的圓盤一定在大的上面。把a柱上的盤子n號盤子移到b柱上,分成兩步,1)把n之前的移走,2)把n號盤移到b柱上,3)把n之前的盤子移回來。

先把這個問題本身搞清楚,再來討論程式實現。

把n之前的盤子移走這個事,不是簡單的一次就可以移走的,這是一個過程。

這個過程要藉助c柱,

移動n-1個盤子的過程,與移動n個盤子的過程相比,除了數量少一個,目標是a到c,沒有本質的不同,這也是使用遞迴的基礎。

把解決問題的過程弄明白了,再來看程式就比較容易了。

n=3,移動3個盤子

實際上我們如果手工去做,要這樣,

1# a-b

2# a-c

1# b-c

3# a-b,這時3#已經就位。

1# c-a

2# c-b

1# a-b

這是移動3個盤子,從a-b。

要移動第4個盤子,這時就可以做了 4# a-c,然後重複前面的過程,把3個盤子移動到過來。

不過剛才移動的3個盤子是a-b,現在則是b-c,但基本的過程是一樣的。

具體 的程式看百科看吧。

關於c語言漢諾塔問題,當程式執行到001、002、003步時,不知道具體是個什麼步驟,求大神解惑!

12樓:凌雨歿

第一步是,將n-1個盤子從柱子a移動到柱子c,通過柱子b。

第二步就是將最後1個盤子從a移動到c。

第三步就是將在b上的盤子,通過a移動到c。

舉個例子:a,b,c三根柱子,a柱子從下至上編號1,2,3的盤子那麼第一步就是將上2,3兩個個盤子移動到b:那就是將3移動到c,將2移動到b,將3移動到b。

第二步就是將3移動到c。

第三步就是將2,3兩個盤子移動到c:將3移動到a,將2移動到c,將3移動到c。

總結一下就是:

當a塔上有n個盤子是,先將a塔上編號1至n-1的盤子(共n-1個)移動到b塔上(藉助c塔),

然後將a塔上最大的n號盤子移動到c塔上,

最後將b塔上的n-1個盤子藉助a塔移動到c塔上。

c語言漢諾塔問題,C語言漢諾塔問題

關於漢諾塔這個東西是相當的抽象,我當時學習的時候看了好幾個版本的教程,也沒有搞懂,最後還是自己反覆的理解,頓悟了,所以我這裡把當時我作為初學者的想法寫給你,但是最重要的還得靠你自己的理解 1 對於void hanoi int n,char one char two,char three 這個函式,表...

c語言漢諾塔程式,C語言漢諾塔程式

將以下內容全部複製到新建的原始檔中 本人自己寫的,因為你那課本上的 沒解釋,書寫不規範,很難理解清楚,所以我直接新寫了一個完整的 附帶詳細說明 include 漢諾塔x層塔從a塔整體搬到c塔,中間臨時b塔。x層塔是從大到小往上疊放。每次移動只能移動一層塔。並且在移動過程中必須保證小層在上邊 藉助b塔...

C語言詳細過程,C語言的學習過程

首先說一聲,這個程式不需要break,你這個do while 迴圈中的一系列case的作用是 你輸入的字串中只要出現aeiou 大小寫 中每一個字母一次,進行v1 出現非aeiou的其他字母一次進行v0 v2 因此v1就是原音的個數,v0是子音的個數,貌似你沒有定義v2呀,你再看看你原來的程式。你的...