四柱汉诺塔分析

版权声明:转就转吧~~记得声明噢~~ https://blog.csdn.net/Soul_97/article/details/82659585

服了这破CSDN 写了一大篇 没给我保存上

直接放代码了

#include <bits/stdc++.h>
using namespace std;
const int N = 105;
const int INF = 0x3f3f3f3f;
long long k[N],tmp[N];
int n;

void init()
{
    for(int i = 1;i < N;i ++)
    {
        tmp[i] = INF;

        for(int j = 1;j <= i;j ++)
        {
            long long t = 2 * tmp[i-j] + 1LL*pow(2,j) - 1;

            if(t < tmp[i])
            {
                tmp[i] = t;
                k[i] = j;
            }
        }
    }
}
void Move(char a,char b)
{
    printf("%c --> %c\n",a,b);
}

void Hanoi3(int x,char a,char b,char c)
{
    if(x == 1)
        Move(a,c);
    else{
        Hanoi3(x-1,a,c,b);
        Move(a,c);
        Hanoi3(x-1,b,a,c);
    }
}

void Hanoi4(int x,char a,char b,char c,char d)
{
    if(x == 1)
        Move(a,d);
    else{
        int tk = k[x];
        Hanoi4(x-tk,a,c,d,b);
        Hanoi3(tk,a,c,d);
        Hanoi4(x-tk,b,a,c,d);
    }
}

int main()
{
    init();

    cin >> n;

    Hanoi4(n,'A','B','C','D');
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Soul_97/article/details/82659585
今日推荐