双Hanoi塔问题是Hanoi塔问题的一种推广:有三根A、B、C三根柱子,现有n对直径大小不同的圆盘(同一对的两个圆盘直径相同),这些圆盘按照直径从大到小的次序从下到上放在A柱上,如果把1个圆盘从从一根柱子移动到另外一根柱子称作1次移动,在移动过程中允许借用B柱子,但不允许大圆盘放在小圆盘上面,每次只能移动一个圆盘。现在要用最少的步数把这些圆盘全部移到C柱,请设计一个算法求出最少移动次数。
输入格式:
一个正整数n(1≤n≤200),表示有n对圆盘。
输出格式:
输出最少的移动次数。
输入样例:
2
输出样例:
6
普通的汉诺塔有公式:输入n,需要2^n-1次.
双汉诺塔同理:输入n,需要2*(2^n-1)因此需要循环2^(n-1)次
因结果数据过大会产生乱码,这里使用数组存结果每一位的高精度形式。
#include<iostream>
using namespace std;
static int a[1000];
void hanoi()
{
int cnt=0;
for(int i=0;i<1000;i++)
{
a[i]=a[i]*2+cnt;
cnt=0;
if(a[i]>=10)
{
a[i]-=10;
cnt=1;
}
}
}
int main()
{
int n;
cin>>n;
a[0]=1;
for(int i=0;i<n+1;i++)
hanoi();
a[0]-=2;
int cnt=0,fare=0;
while(a[cnt]<0)
{
a[cnt]+=10;
a[++cnt]-=1;
}
for(int i=999;i>=0;i--)
{
if(fare==0&&a[i]!=0)
fare=1;
if(fare)
cout<<a[i];
}
return 0;
}