p.s.个人收录用
题目描述
给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。
现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。
输入
一个正整数n,表示在AA柱上放有2n个圆盘。
输出
一个正整数, 为完成上述任务所需的最少移动次数An。
样例输入 Copy
【输入样例1】 1 【输入样例2】 2
样例输出 Copy
【输出样例1】 2 【输出样例2】 6
提示
【限制】
对于50%的数据,1≤n≤25
对于100%的数据,1≤n≤200
【提示】
设法建立An与An−1的递推关系式
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <string.h>
//汉诺双塔
//f(n)=f(n-1)*2+1
int main()
{
int n;
scanf("%d", &n);
int a[210];
memset(a, 0, sizeof(a));
//汉诺塔
int j;
for (int i = 1; i <= n; i++)
{
//乘2加1
for (j = 1; j <= 200; j++)
a[j] = a[j] * 2;
a[1]++;
//进位
for (j = 1; j <= 200; j++)
{
if (a[j] >= 10)
{
a[j + 1] += a[j] / 10;
a[j] = a[j] % 10;
}
}
}
//汉诺双塔
for (j = 1; j <= 200; j++)
a[j] = a[j] * 2;
for (j = 1; j <= 200; j++)
{
if (a[j] >= 10)
{
a[j + 1] += a[j] / 10;
a[j] = a[j] % 10;
}
}
int p = 0;
for (int i = 200; i >= 1; i--)
{
if (a[i] != 0)
p = 1;
if (p)
printf("%d", a[i]);
}
}