分析:
当只有一个盘子的时候,只需要从将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 !\n",count,n,a,c);
}

最新文章

  1. ListView控件--2016年12月9日
  2. iOS 动画绘制线条颜色渐变的折线图
  3. FineUI常见问题
  4. centos7设置网关
  5. svn冲突问题详解
  6. sql问题集合
  7. asp.net 去掉重复的querystring
  8. Bi-shoe and Phi-shoe(欧拉函数)
  9. 文件和目录之utime函数
  10. 基于51单片机IIC通信的PCF8591学习笔记
  11. 201521123035《Java程序设计》第六周学习总结
  12. [COGS 2258][HZOI 2015]复仇的序幕曲
  13. centos7 安装mysql5.7.20(yum方式)
  14. golang的dlv调试工具print打印字符串显示more,无法显示更多
  15. spring-data-jpa初步认识
  16. Linux命令行获取本机外网IP地址
  17. PHP二维数据排序,二维数据模糊查询
  18. strust2的Action中validateXxx方法的用法
  19. python之简单的get和post请求
  20. 19-从零玩转JavaWeb-继承关系与方法覆盖

热门文章

  1. MyBatis-04-配置解析
  2. CF875F Royal Questions[最大生成基环树森林]
  3. linux系统常用命令(一)
  4. java8新特性学习:stream与lambda
  5. java.sql.SQLException: Unknown column &#39;user0_.user_name&#39; in &#39;field list&#39; 报错问题
  6. php+memcache实现的网站在线人数统计
  7. swagger2 常用注解说明
  8. 激活WebStorm2017.3.1
  9. 前端Web浏览器基于Flash如何实时播放监控视频画面(二)之Windows搭建(RTMP)流媒体服务器
  10. hdu 5821 Ball 思维题