码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1995 汉诺塔V

时间:2017-08-06 18:02:13      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:故事   存在   class   cstring   ret   main   while   汉诺塔   std   

用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 1

Sample Output

576460752303423488
4

拿n-1個盤的時候,其實就是這最底下那個盤的移動,若我們設f(n)是第n個盤的移動次數,那麼就很容易猜想到f(n-1) = 2f(n)所以f(k) = 2f(k+1)

 f(n) = 1; 所以f(k) = 2^(n-k);

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 int main(){
 7     int t,n,k;
 8     scanf("%d",&t);
 9     while(t--){
10         scanf("%d%d",&n,&k);
11         cout<<(long long)pow(2.0,n-k)<<endl;
12     }
13     return 0;
14 }

HDU 1995 汉诺塔V

标签:故事   存在   class   cstring   ret   main   while   汉诺塔   std   

原文地址:http://www.cnblogs.com/shixinzei/p/7295183.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!