汉诺塔问题

问题描述


 1. 将A上的盘子按顺序移动到C上

 2. 任何移动结果保证大盘在下小盘在上


问题分析

 n: 从上到下编号1...n


 1. n = 1      A-->C

 

 


 2. n = 2     A-->B,  A-->C, B-->C

  3. 定义 hanoi(盘数, 源柱子, 辅助柱, 目标柱) 为对应盘数的汉诺塔操作

     对于任意盘数, 我们将它分为如下两部分 1, 2

     则对于第 1 部分我们使用 hanoi() 做 A-->B 的移动(辅助移动)

     对于第 2 部分移动为 A-->C

     最后使用 hanoi() 对第 1 部分做 B-->C的移动

     

   对与第 1 部分我们的源塔为 A, 目标塔为 B, 辅助塔为 C,

   因为任何移动结果都有大盘在下, 小盘在上的约定, 所以在每次移动中, 任何一个塔都可以作为辅助塔

    则第 1 部分的 A-->B 移动为 hanoi(n-1, A, C, B)


   同理第一部分从 B-->C 的移动为 hanoi(n-1, B, A, C)

   此时 源塔为 B, 目标塔为 C, 辅助塔为 A


代码

#include <stdio.h>

void hanoi(int amount, char pag_src, char pag_aux, char pag_des) {
    // 递归结束条件, 基本移动
    if (amount == 1) {
        printf("将第 %d 个盘子从 %c 移动到 %c\n", amount, pag_src, pag_des);

    } else {
        hanoi(amount-1, pag_src, pag_des, pag_aux);
        printf("将第 %d 个盘子从 %c 移动到 %c\n", amount, pag_src, pag_des);
        hanoi(amount-1, pag_aux, pag_src, pag_des);
    }
}

int main() {
    int     amount;
    printf("请输入盘数: ");
    scanf("%d", &amount);
    hanoi(amount, 'A', 'B', 'C');
    return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值