汉诺塔V - ACM解决方法
生活随笔
收集整理的這篇文章主要介紹了
汉诺塔V - ACM解决方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Problem Description
用1,2,...,n表示n個盤子,稱為1號盤,2號盤,...。號數大盤子就大。經典的漢諾塔問題經常作為一個遞歸的經典例題存在。可能有人并不知道漢諾塔問題的典故。漢諾塔來源于印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動一個圓盤。我們知道最少需要移動2^64-1次.在移動過程中發現,有的圓盤移動次數多,有的少 。 告之盤子總數和盤號,計算該盤子的移動次數.Input
包含多組數據,首先輸入T,表示有T組數據.每個數據一行,是盤子的數目N(1<=N<=60)和盤號k(1<=k<=N)。Output
對于每組數據,輸出一個數,到達目標時k號盤需要的最少移動數。Sample Input
2 60 1 3 1Sample Output
576460752303423488 4=======================================================
解題思路
本以為是用數組逐個記錄移動次數,結果沒做出來,查詢后發現原來是可以推出公式的。。。假設有10個盤子,那么:| 10 | 1 | 10-10 |
| 9 | 2 | 10-9 |
| 8 | 4 | 10-8 |
| 7 | 8 | 10-7 |
=======================================================
代碼如下:
# include <stdio.h> int main (void) {int m, n, k;long long a;while (scanf("%d\n", &m)!=EOF){while (m--){scanf("%d%d\n", &n, &k);a = pow (2, n-k);printf("%lld\n",a);}} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的汉诺塔V - ACM解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 部分常用命令
- 下一篇: 笨小熊 -- ACM解决方法