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

2022-05-05 21:54:16 字數 1139 閱讀 3384

問題描述

輸入格式

一行,包含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 2

intmain()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 }

view code

自己寫了一下,也能通過。關鍵**參考了部落格,裡面也對漢諾塔及相關**進行了詳細講解 

1 #include 2 #include 3 #include 

4 #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...