藍橋杯 演算法提高 漢諾塔(遞迴)(C )

2021-10-09 06:28:09 字數 1070 閱讀 7583

問:如何移?最少要移動多少次?

輸入格式

一行,包含2個正整數,乙個是n(n<=15),表示要移動的盤子數;乙個是m,表示在最少移動d第m步

輸出格式

共2行。

第一行輸出格式為:#no: a->b,表示第m步驟具體移動方法,其中no表示第m步移動的盤子的編號(n個盤子從上到下依次編號為1到n),表示第m步是將no號盤子從a杆移動到b杆(a和b的取值均為)。

第2行輸出乙個整數,表示最少移動步數。

樣例輸入

3 2

樣例輸出

#2: a->b

7

資料規模和約定

0hanoi塔問題解析(一)c++實現這篇文章對漢諾塔的遞迴分析很好。可以閱讀一下這篇文章,再來做漢諾塔這道題就會迎刃而解。

思路分析:

1.如果a桿上只有乙個圓盤,那麼可以直接將這乙個圓盤從a杆移動到c杆;

2.如果a桿上有n個圓盤,那麼我們可以將從上到下n-1個圓盤看為乙個整體,首先將這n-1個圓盤從a杆移到b杆(借助c杆),再將第n個圓盤從a杆直接移動到c杆,最後再將b桿上的n-1個圓盤移動到c杆(借助a杆)。

3.將n-1個圓盤移動的過程中,可以將其從上到下的n-2個圓盤先看成乙個整體,再進行移動,這和步驟2的過程相同,因此這是乙個遞迴的過程。

4.(1<#include

#include

using

namespace std;

int n,m;

int cnt=0;

void

hanoi

(int n,

char a,

char b,

char c)

hanoi

(n-1

,a,c,b)

;//表示將n-1個圓盤從a杆移動到b杆(借助c杆)

cnt++;if

(cnt==m)

hanoi

(n-1

,b,a,c)

;//表示將n-1個圓盤從b杆移動到c杆(借助a杆)

}int

main()

藍橋杯 試題 演算法提高 漢諾塔

3 2 2 a b 71 本題利用遞迴思想便可以很簡單的理解其思路。在a上有n個盤子時,只需要將上面的n 1個盤中利用c,按規則放置在b上,然後將a上的最後乙個盤中放置在c上即可 同理,下一步將b上的n 2個盤子利用c放置在a上即可,以此類推。void hanoi int n,char a,char...

藍橋杯 試題 演算法提高 漢諾塔

問題描述 輸入格式 一行,包含2個正整數,乙個是n n 15 表示要移動的盤子數 乙個是m,表示在最少移動d第m步 輸出格式 共2行。第一行輸出格式為 no a b,表示第m步驟具體移動方法,其中no表示第m步移動的盤子的編號 n個盤子從上到下依次編號為1到n 表示第m步是將no號盤子從a杆移動到b...

漢諾塔 遞迴演算法

個人覺得漢諾塔這個遞迴演算法比電子老鼠的難了一些,不過一旦理解了也還是可以的,其實網上也有很多 可以直接參考。記得大一開始時就做過漢諾塔的習題,但是那時 寫得很長很長,也是不理解遞迴的結果。現在想起來漢諾塔的演算法就3個步驟 第一,把a上的n 1個盤通過c移動到b。第二,把a上的最下面的盤移到c。第...