P1760 通天之汉诺塔

题目背景

直达通天路·小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;
}
发布了53 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/YUEXILIULI/article/details/103971751