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