hanoi(汉诺塔)问题

汉诺塔问题是经典的递推问题,问题的简单描述为:
三根柱子ABC,A上有64个盘子,大的在最下边,晓得在最上边,要把这64个盘子从A上转移到C上并且过程中一直保持晓得在大的上边。
分析过程:
1>假如只有一个盘子,可以直接从A移动到C上,即A-C。
2>假如有两个盘子,则先把A上的小盘子移动到B柱接着把A上的大盘子移动到C柱,最后把B上的小盘子移动到C柱。
A->B
A->C
B->C
3>假如有三个盘子,则情况开始复杂,
A->C
A->B
C->B
A->C
B->A
B->C
A->C
当盘子数量增加的时候,再继续这种分析是非常复杂的,但是根据上面的情况,可以发现其中的规律:

1>先把A柱子上n-1个盘子借助C柱移动到B柱上只有这样,才可以把A上的最大的盘子移动到C上
2>将A柱子上的第n个盘子移动到C柱上。归位。
3>再将B柱上的n-1个盘子借助于A柱移动到C柱上。

这里写一下移动过程:

#include<stdio.h>
void move(char soure,char target)      //打印从soure移动到target的函数
{
    printf("&c--->%c\n",soure,targert);
}

void hanoi(int n,char A,char B, char C)    //递归函数
{
    if(n==1)
    move(A,C)
    else
    {
        hanoi(n-1,A,C,B);
        move(A,C);
        hanoi(n-1,B,A,C);
    }
}


int main()
{
    int n;
    scanf("%d",&n);
    hanoi(n,'A','B','C');
    return 0;
}

在这个代码中,充分利用了递推,函数嵌套函数,实现递推,可谓经典算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值