四柱汉诺塔问题

#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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值