C语言简单实现汉诺塔问题

C语言简单实现汉诺塔问题

汉诺塔基本介绍

什么是汉诺塔?

  • 三根圆柱,其中一根圆柱上有n个圆盘,且圆盘是按照从上到下逐渐变大的方式排列。
  • 规定一次只能移动一个圆盘,且圆盘始终保持从上到下逐渐变大的方式排列,最终将所有圆盘全部移到另一根柱子上。

2-210R0100929200.gif

使用C语言解决汉诺塔问题

本次实现汉诺塔问题只是简单打印到屏幕上编号圆盘

  • 分析解决问题思路:

    1. 将n-1个圆盘,通过目标柱转移至辅助柱。
    2. 将第n个圆盘,移至目标柱。
    3. 将n-1个圆盘,通过辅助柱转移至目标柱。
  • 代码实现

    • 首先创建一个移动函数,作用为打印编号盘移动目标。

      • void move(int n, char a, char c)
        {
            printf("%d:%c - > %c\n", n, a, c);// n是圆盘编号
        }
        
    • 使用递归完成汉诺塔问题

      • void Hanoi(char a, char b, char c, int n)
        {
            if(n == 1) // 当只有一个圆盘时,只要移至目标柱即可。
            {
                move(n, a, c);
                return;
            }
            Hanoi(a, c, b, n - 1); // 完成前n-1个圆盘通过目标柱转移至辅助柱。
            move(n, a, c);
            Hanoi(b, a, c, n - 1); // 完成前n-1个圆盘通过辅助柱转移至目标柱。
        
        }
        
  • 完整代码:

    • #include <stdio.h>
      
      void move(int, char, char);
      
      
      void Hanoi(char a, char b, char c, int n)
      {
          if(n == 1)
          {
              move(n, a, c);
              return;
          }
          Hanoi(a, c, b, n - 1);
          move(n, a, c);
          Hanoi(b, a, c, n - 1);
      
      }
      void move(int n, char a, char c)
      {
          printf("%d:%c - > %c\n", n, a, c);// n是圆盘编号
      }
      
      
      int main()
      {
          // 汉诺塔问题
      
          // A、B、C三根柱子
          char a = 'A';
          char b = 'B';
          char c = 'C';
      
          int n = 0; // 圆盘变量
          scanf("%d", &n);
          Hanoi(a, b, c, n);
          return 0;
      }
      
    • Snipaste_2023-07-15_15-46-48.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烛九_阴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值