• C语言基础:汉诺塔(递归方法)


    分析:
    当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。
    当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,
    再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。
    当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),
    然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。
    当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),
    然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。 
    第一个参数n:代表盘子的个数,也为盘子编号 
    第二个参数a:代表源杆
    第三个参数b:代表中间杆
    第四个参数c:代表目标杆

    #include <stdio.h>
    void Hanoi(int n, char a,char b,char c);
    void Move(int n, char a, char c);
    int count;

    void main()

      int n=4;//个数 

      Hanoi(n, 'A', 'B', 'C');
    }

    void Hanoi(int n, char a, char b, char c)
    {
      if (n == 1)//当盘子的个数为1,直接将源杆上的盘子移动至目标杆 
      {
        Move(n, a, c);
      }
      else
      {
        Hanoi(n - 1, a, c, b);//a为初始塔,将n-1个盘子借助c移动到b上 
        Move(n, a, c);//将剩下的一个盘子n,直接从初始塔a移动到目标塔c上 
      Hanoi(n - 1, b, a, c);//此时将b看作初始塔,b借助a移动到c 
      }
    }

    void Move(int n, char a, char c)//第一个参数n:代表要移动的盘子,第二参数a:源杆,第三个参数c:目标杆 
    {
      count++;//记录所移动步数 
      printf("第%d次移动 Move %d: Move from %c to %c ! ",count,n,a,c);
    }

  • 相关阅读:
    反射+注解:excel2module
    RSA签名
    base642photo
    maven命令
    201421123042 《Java程序设计》第14周学习总结
    201421123042 《Java程序设计》第13周学习总结
    201421123042 《Java程序设计》第12周
    201421123042 《Java程序设计》第10周学习总结
    201421123042 《Java程序设计》第9周学习总结
    201421123042 《Java程序设计》第8周学习总结
  • 原文地址:https://www.cnblogs.com/kuangzhisen/p/6863428.html
Copyright © 2020-2023  润新知