[算法系列] 汉诺塔

这是一篇关于算法学习的博客,主要介绍了汉诺塔问题。作者作为程序员,通过学习算法来提升自己的技能,旨在成为一名全栈工程师。文中直接展示了相关代码,适合对递归算法感兴趣的读者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:

     我是一个小小的程序员,我的野心是成为一个全栈工程师!!!


正文:

    这是我用来记录学习算法的一个系列。希望能与所有人共进步。

    好了,不废话了,直接上代码。


/***********************************
 **
 ** 算法:汉诺塔
 **
 ** 问题:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,
 **     要把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,
 **     请问至少需要多少次移动,设移动次数为H(n)。
 **
 ** 解决:
 **
 ***********************************/
#include <stdio.h>
#include <stdlib.h>

static int Time=0;
int main()
{
    int n;
    printf("请输入圆盘个数: ");
    scanf("%d",&n);

    hanoi(n,'A','B','C');
    printf("移动次数:%d",Time);
    return 0;
}

/**
 * 将n个圆盘从A移动到C上,B为缓冲区
 */
void hanoi(int n,char A,char B,char C) {
    if(n==1) {
        //如果只有一个盘,直接从A移动到C即可
        move(n,A,C);
    }else {
        //否则将A柱子上n-1个圆盘用此函数移动到B柱子上放着
        hanoi(n-1,A,C,B);
        //然后将最大的圆盘n放到C盘上
        move(n,A,C);
        //再将B柱上的n-1个圆盘通过以A柱为缓冲区,移动到C柱上
        hanoi(n-1,B,A,C);
    }
}

/**
 * 移动圆盘
 * @param n int 圆盘序号
 * @param Source char 源柱子
 * @param Target char 目标柱子
 */
void move(int n,char Source,char Target) {
    printf("将第%d个圆盘从%c移动到%c\n",n,Source,Target);
    Time++;
}

具体内容请看注释以及自己复制后运行一下,再结合代码参透其中的内容,其核心就是一个递归。


小尾巴:

    吾王剑之所指,即吾等身之所向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值