题目描述
给定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?。
输入输出样例
输入样例#1: 复制
【输入样例1】 1 【输入样例2】 2
输出样例#1: 复制
【输出样例1】 2 【输出样例2】 6
说明
【限制】
对于50\%50%的数据,1 \le n \le 251≤n≤25
对于100\%100%的数据,1 \le n \le 2001≤n≤200
【提示】
设法建立A_nAn?与A_{n-1}An−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; }
原文地址:https://www.cnblogs.com/xiongchongwen/p/11188234.html
时间: 2024-11-09 09:59:02