P1096 Hanoi 双塔问题
Posted xiongchongwen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1096 Hanoi 双塔问题相关的知识,希望对你有一定的参考价值。
题目描述
给定AA、BB、CC三根足够长的细柱,在AA柱上放有2n2n个中间有孔的圆盘,共有nn个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3n=3的情形)。
现要将这些圆盘移到CC柱上,在移动过程中可放在BB柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2)AA、BB、CC三根细柱上的圆盘都要保持上小下大的顺序;
任务:设A_nAn?为2n2n个圆盘完成上述任务所需的最少移动次数,对于输入的nn,输出A_nAn?。
输入输出格式
输入格式:
一个正整数nn,表示在AA柱上放有2n2n个圆盘。
输出格式:
一个正整数, 为完成上述任务所需的最少移动次数A_nAn?。
输入输出样例
说明
【限制】
对于50\%50%的数据,1 \le n \le 251≤n≤25
对于100\%100%的数据,1 \le n \le 2001≤n≤200
【提示】
设法建立A_nAn?与A_n-1An−1?的递推关系式。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; int n,a[610],where=610; int main() a[1]=1; scanf("%d",&n); for(int i=2;i<=n;i++) for(int k=1;k<=i-1;k++) a[k]*=2; for(int k=1;k<=i-1;k++) if(a[k]>=10) a[k]-=10; a[k+1]++; a[1]++; for(int k=1;k<=690;k++) a[k]*=2; for(int k=1;k<=690;k++) if(a[k]>=10) a[k]-=10; a[k+1]++; while(a[where]==0) where--; for(int i=where;i>=1;i--) printf("%d",a[i]); return 0;
以上是关于P1096 Hanoi 双塔问题的主要内容,如果未能解决你的问题,请参考以下文章