汉诺塔问题

题目描述

我们都已经知道了汉诺塔问题,如果还有不懂得可以看以下解释:

汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三个金刚石柱子,在一根柱子上从上往下,按从小到大顺序摞着64片黄金圆盘,上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并且规定,在小圆盘上不能放大圆盘,在三根柱子之间每次只能移动一个圆盘,只能移动在最顶端的圆盘。

现在有 n 个圆盘从上往下,从小到大叠在第一根柱子上,要把这些圆盘全部移动到第三根柱子,我们都知道,最少的移动数目为 2^n - 1 次。但是现在我们要求的并不是这个。

我们用 1,2,...,n 表示 n个盘子的编号,编号越大盘子就越大。在移动过程中,有的圆盘移动次数多,有的少。告知盘子总数和盘号,计算该盘子的移动次数。

输入

输入包含多组数据,首先输入 T ,表示有 T 组数据。每个数据一行,是盘子的数目(1 <= N <= 60)和盘号 k (1 <= k <= N)。

输出

对于每组数据,输出一个数,即到达目标时 k 号盘需要的最少移动数。

样例输入 

2
60 1
3 1

样例输出

576460752303423488
4
#include<stdio.h>
#include<string.h>
long long power(int n){
    long long t=1;
    int i;
    for(i=1;i<=n;i++){
        t*=2;
    }
    return t;
}
int main(){
    int n,t,k;
    while(scanf("%d",&t)!=EOF){
        while(t--){
        scanf("%d%d",&n,&k);
        
        printf("%lld\n",power(n-k));    
        }
    }
    
        
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值