2014年广州市信息学尖子选拔赛 第一题

本文探讨了经典的汉诺塔问题的扩展版本——四柱汉诺塔问题,并提供了一个有效的算法解决方案。通过分析不同数量的盘子在四根柱子间的移动规律,给出了一种计算最少移动步数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提交文件:hanoi.exe
输入文件:hanoi.in
输出文件:hanoi.out
题目描述:
你对经典的hanoi塔问题一定已经很熟悉了。有三根柱子,n个大小不一的圆盘,要求大盘不能压在小盘上,初始时n个圆盘都在第一根柱子上,最少要多少步才能挪到最后一根柱子上?
现在我们来将hanoi塔扩展一下,由三根柱子扩展到四根柱子,其余规则不变。例如,3个圆盘,四根柱子A到D,初始时圆盘都A柱上,我们用五步就可以将圆盘都挪到D柱上:
第一步:将圆盘1从A挪到B;
第二步:将圆盘2从A挪到C;
第三步:将圆盘3从A挪到D;
第四步:将圆盘2从C挪到D;
第五步:将圆盘1从B挪到D。
你的任务是写一个程序求解四柱子hanoi塔问题最少要多少步可以解决。
输入格式(light.in):
输入只有一行,为一个正整数n。(1<=n<=1000)
输出格式(light.out):
输出为一个正整数,代表n盘四柱子hanoi塔问题最少要多少步可以解决。
样例
hanoi.in hanoi.out
3 5

#include<cstdio>

int i,k,n,s;

int main(){
    freopen("hanoi.in","r",stdin);
    freopen("hanoi.out","w",stdout);
    scanf("%d",&n);
    switch(n){
        case 1:{
             printf("%d",1);
             return 0;
        }
        case 2:{
             printf("%d",3);
             return 0;
        }
    }
    n--;i=2;k=2;s=1;
    while(true){
        if(n>i){
            n=n-i;
            s=s+i*k;
            i++;
            k=k*2;
        }
        else{
            s=s+n*k;
            break;
        }
    }
    printf("%d",s);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值