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 !\n",count,n,a,c);
}
最新文章
- ListView控件--2016年12月9日
- iOS 动画绘制线条颜色渐变的折线图
- FineUI常见问题
- centos7设置网关
- svn冲突问题详解
- sql问题集合
- asp.net 去掉重复的querystring
- Bi-shoe and Phi-shoe(欧拉函数)
- 文件和目录之utime函数
- 基于51单片机IIC通信的PCF8591学习笔记
- 201521123035《Java程序设计》第六周学习总结
- [COGS 2258][HZOI 2015]复仇的序幕曲
- centos7 安装mysql5.7.20(yum方式)
- golang的dlv调试工具print打印字符串显示more,无法显示更多
- spring-data-jpa初步认识
- Linux命令行获取本机外网IP地址
- PHP二维数据排序,二维数据模糊查询
- strust2的Action中validateXxx方法的用法
- python之简单的get和post请求
- 19-从零玩转JavaWeb-继承关系与方法覆盖
热门文章
- MyBatis-04-配置解析
- CF875F Royal Questions[最大生成基环树森林]
- linux系统常用命令(一)
- java8新特性学习:stream与lambda
- java.sql.SQLException: Unknown column &#39;user0_.user_name&#39; in &#39;field list&#39; 报错问题
- php+memcache实现的网站在线人数统计
- swagger2 常用注解说明
- 激活WebStorm2017.3.1
- 前端Web浏览器基于Flash如何实时播放监控视频画面(二)之Windows搭建(RTMP)流媒体服务器
- hdu 5821 Ball 思维题