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

来源:互联网 发布:天下信用的数据哪来的 编辑:程序博客网 时间:2024/04/27 14:01

提交文件: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);}
0 0