汉诺塔问题
2015-12-09 13:48
330 查看
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
每次只能移动一个圆盘;
大盘不能叠在小盘上面。
提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
问题分析:
当只有一个盘子时 盘子编号为1,
直接将编号为1的盘子从A移动到C
表示为如下:
1:A–>C
当有2个盘子时,盘子编号为2和1,其中2在1下面,编号越大表示盘子越大。
1:A–> B
2:A–>C
1:B–>C
当有3个盘子时,编号3 2 1,这样移动:
(1~2):A-C->B
3:A–>C
(1~2):B-A->C
其中,(1~2):A-C->B表示将编号从1到2的盘子从A移动到B,其中移动的过程需要借助C来临时存放盘子。
当有n个盘子时,编号n,n-1,……3 2 1,这样移动:
(1~n-1):A-C->B
n:A–>C
(1~n-1):B-A->C
翻译成代码就是:
完整代码如下:
当N=2时,运行结果:
当N=3时,运行结果:
每次只能移动一个圆盘;
大盘不能叠在小盘上面。
提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
问题分析:
当只有一个盘子时 盘子编号为1,
直接将编号为1的盘子从A移动到C
表示为如下:
1:A–>C
当有2个盘子时,盘子编号为2和1,其中2在1下面,编号越大表示盘子越大。
1:A–> B
2:A–>C
1:B–>C
当有3个盘子时,编号3 2 1,这样移动:
(1~2):A-C->B
3:A–>C
(1~2):B-A->C
其中,(1~2):A-C->B表示将编号从1到2的盘子从A移动到B,其中移动的过程需要借助C来临时存放盘子。
当有n个盘子时,编号n,n-1,……3 2 1,这样移动:
(1~n-1):A-C->B
n:A–>C
(1~n-1):B-A->C
翻译成代码就是:
//将n个盘子从 A借助B移动到C static void move(int n, String A,String B,String C) { if (n == 1) { //将第n个盘子从 A 移动到 C singleStep(n, A, C); } else { move(n-1, A, C, B); singleStep(n, A, C); move(n-1, B, A, C); } }
完整代码如下:
public class HanNuo { static int steps = 0; static int N = 2; public static void main(String[] args) { move(N, "A", "B", "C"); } //将n个盘子从 src借助between移动到 dest static void move(int n, String src,String between,String dest) { if (n == 1) { singleStep(n, src, dest); } else { move(n-1, src, dest, between); singleStep(n, src, dest); move(n-1, between, src, dest); } } //将第n个盘子从 src 移动到 dest static void singleStep(int n, String src, String dest) { steps++; System.out.printf("第%d步,第%d个盘子:%s-->%s\n",steps,n,src,dest); } }
当N=2时,运行结果:
当N=3时,运行结果:
相关文章推荐
- Josephus问题解决方法五(递归)
- windows误删文件恢复
- Web安全:XSS的原理分析与解剖
- Mysql中普通的索引、主键、唯一、全文索引的区别
- HDU 4757 Tree 可持久化字典树
- 用基础动画实现iOS控件循环旋转
- request使用getReader()和getInputStream()获取请求参数报400错误
- 博客收集
- 【原创】Oracle实现PGSQL的generate_series
- Linux 下编译及调试 C 代码的简易指南
- Android-多线程
- 内容分发平台个性化推荐系统经验简单总结
- Linux Kernel(Android) 加密算法汇总(四)-应用程序调用OpenSSL加密演算法
- 基于cookie实现zTree树刷新后,展开状态不变
- 丢沙包游戏(或杀人游戏)的C语言实现
- ReactiveCocoa RACObserve subscribeNext 时,只有值不一样时才响应
- Spring4.2.3 +Struts2.3.24 +Hibernate4.3.11配置过程
- font-size --- inline-block
- 开始博客之旅,记录工作点滴!
- DMA Engine API Guide