問:如何移?最少要移動多少次?
輸入格式
一行,包含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。第...