题目背景
直达通天路·小A历险记第四篇
题目描述
在你的帮助下,小A成功收集到了宝贵的数据,他终于来到了传说中连接通天路的通天山。但是这距离通天路仍然有一段距离,但是小A突然发现他没有地图!!!但是幸运的是,他在山脚下发现了一个宝箱。根据经验判断(小A有经验吗?),地图应该就在其中!在宝箱上,有三根柱子以及在一根柱子上的n个圆盘。小A在经过很长时间判断后,觉得这就是hanoi塔!(这都要琢磨)。但是移动是需要时间的,所以小A必须要通过制造延寿药水来完成这项任务。现在,他请你告诉他需要多少步完成,以便他造足够的延寿药水.。时限1s。
输入格式
一个数n,表示有n个圆盘
输出格式
一个数s,表示需要s步。
输入输出样例
输入 #1
31
输出 #1
2147483647
输入 #2
15
输出 #2
32767
说明/提示
对于所有数据n<=15000
很容易的练手题哦!
汉诺塔移动次数计算公式:f(n)=2^n-1
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<cstdio>
using namespace std;
#pragma warning(disable:4996)
int n, l, i, a[10000];
void p()
{
for (int i = 1; i <= l; i++)a[i] *= 2;//每一位都*2
for (int i = 1; i <= l; i++)//各位是否>9,是则进位
{
if (a[i] > 9)
{
a[i + 1]++;
a[i] -= 10;
}
}
if (a[l + 1] > 0)l++;//高位进位,长度+1
}
int main()
{
cin >> n;
a[1] = 1;
l = 1;//答案长度为1
for (i = 0; i < n; i++)p();//求2^n
for (i = l; i > 1; i--)cout << a[i];//打印高位
cout << a[1] - 1;//末位减1
return 0;
}