#include<iostream>
#include<math.h>
using namespace std;
int f[1000],kk[1000];
void minMoves(int n)
{
f[0]=0;
f[1]=1;
f[2]=3;
for(int i=3; i<=n; i++)
{
f[i]=2*f[i-1]+2-1;
kk[i]=1;
for(int k=2; k<i; k++)
{
int temp=2*f[i-k]+(int)pow(2,k)-1;
if(temp<f[i])
{
f[i]=temp;
kk[i]=k;
}
}
}
}
//void Print(int n)
//{
// cout<<f[n]<<endl;
//}
void Move(char c1,char c2 )
{
printf("%c-->%c\n",c1,c2);
}
void hanoi(int n,char a,char b,char c)
{
if(n==1)
Move(a,b);
else
{
hanoi(n-1,a,c,b);//将a上的通过b移动到c
Move(a,b);
hanoi(n-1,c,b,a);//将c上的通过a移动到b
}
}
void fourhanoi(int n,char a,char b,char c,char d)
{
if(n==1)
Move(a,b);
else
{
int tk=kk[n];
fourhanoi(n-tk,a,d,b,c);//将a上的通过b,c移动到d
hanoi(tk,a,b,c);//三柱汉诺塔
fourhanoi(n-tk,d,b,a,c);//将d上的通过a,c移动到b
return ;
}
}
int main()
{
int n;
cin>>n;
minMoves(n);//求四柱汉诺塔的最小移动次数
// Print(n);
fourhanoi(n,'a','b','c','d');
return 0;
}
四柱汉诺塔问题
最新推荐文章于 2024-08-29 16:37:54 发布