問題描述
輸入格式
一行,包含2個正整數,乙個是n(n<=15),表示要移動的盤子數;乙個是m,表示在最少移動d第m步
輸出格式
共2行。
第一行輸出格式為:#no: a->b,表示第m步驟具體移動方法,其中no表示第m步移動的盤子的編號(n個盤子從上到下依次編號為1到n),表示第m步是將no號盤子從a杆移動到b杆(a和b的取值均為)。
第2行輸出乙個整數,表示最少移動步數。
下面是大神的**,搞了半天沒看明白,貼上來以後再研究:
1 #include 2view codeintmain()3;
9 n = 1
; 10
while((m&1)==0)11
15 m=m>>1
;16 r=(n+n)%2;17
if(r)
1822
else
2327
28 printf("
%d\n
",(1
<1);//
最小移動容步數
29return0;
30 }
自己寫了一下,也能通過。關鍵**參考了部落格,裡面也對漢諾塔及相關**進行了詳細講解
1 #include 2 #include 3 #include4 #include 5
using
namespace
std;
6int
n,m;
7int count = 0;8
void hanoi(int n,char a,char b,charc)9
17 hanoi(n-1
,a,c,b);
18 count++;
19if(count==m)
20 printf("
#%d: %c->%c\n
",n,a,c);
21 hanoi(n-1
,b,a,c);22}
23int
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...
藍橋杯 演算法提高 漢諾塔(遞迴)(C )
問 如何移?最少要移動多少次?輸入格式 一行,包含2個正整數,乙個是n n 15 表示要移動的盤子數 乙個是m,表示在最少移動d第m步 輸出格式 共2行。第一行輸出格式為 no a b,表示第m步驟具體移動方法,其中no表示第m步移動的盤子的編號 n個盤子從上到下依次編號為1到n 表示第m步是將no...