河内五钉塔

问题描述 投票:-1回答:1

第9步出现问题。做出错误的举动

我正在寻找解决方案。我没有找到它,所以我尝试将河内4钉代码更改为5钉。而且它不能正常工作

void Shift(int s, int d){
    cout<<s<<" "<<d<<endl;
}

void Hanoi5(int n, int from_rod, int to_rod,int aux_rod1, int aux_rod2, int aux_rod3)
{
    if (n == 0)
        return;
    if (n == 1) {
        Shift(from_rod,to_rod);
        return;
    }

    Hanoi5(n - 2, from_rod, aux_rod1, aux_rod2, aux_rod3, to_rod);
    Shift(from_rod, aux_rod3);
    Shift(from_rod, aux_rod2);
    Shift(from_rod, to_rod);
    Shift(aux_rod2, to_rod);
    Shift(aux_rod3, to_rod);
    Hanoi5(n - 2, aux_rod1, to_rod, from_rod, aux_rod2, aux_rod3);
}

int main(){
Hanoi5(5,1, 2, 3, 4, 5);
}

4钉解决方案:

if (n == 0)
        return;
    if (n == 1) {
        Shift(from_rod,to_rod);
        return;
    }

    Hanoi4(n - 2, from_rod, aux_rod1, aux_rod2, to_rod);
    Shift(from_rod, aux_rod2);
    Shift(from_rod, to_rod);
    Shift(aux_rod2, to_rod);
    Hanoi4(n - 2, aux_rod1, to_rod, from_rod,aux_rod2);

我需要一个动作列表,在9号出问题了

c++
1个回答
0
投票

我认为您只是在学习解决方案,不知道如何解决。如果是您了解问题,那么您应该知道没有所谓的问题编程为4钉或编程为5钉。无论您通过4还是5,算法都应该是通用的。它不应该像6那样需要增加一行来换行,而7需要7来增加行。程序应该自己完成。因此,请考虑再次学习。这是简单的方法。检查您是否理解它,或者将其注释掉,我将很乐意对其进行详细说明。

void move(int  , char  , char  , char );
int count = 0;
int main()

{
    char A = 'A' , B = 'B' , C = 'C';
    move(6,A,C,B);
    printf("%d",count);
    return 0;
}
void move(int n , char source , char destination,char aux)
{
    if(n==1){
        count++;
        printf("Move rod from %c to %c\n",source,destination);
        return;
    }
    move(n-1,source,aux,destination);
    move(1,source,destination,aux);
    move(n-1,aux,destination,source);
}
© www.soinside.com 2019 - 2024. All rights reserved.