汉诺塔问题的算法分析与实现(Java)
2013-10-05 11:39
615 查看
汉诺塔问题是源于印度一个古老传说的益智玩具。要求将圆盘从A柱移动到C柱规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
可以先通过3个盘子的hanoi游戏得出其算法步骤如下:
if n=1 , 直接将圆盘移到c棒
if n>1 ,
将A棒上的n-1个圆盘移到B棒上
将A棒上的1个圆盘移到C棒上
将B棒上的n-1个圆盘移到C棒上
(图:3个盘子时第一步和第二步如上图所示)
用Java的实现代码如下
算法分析:
n = 1 时,只需要移动一次即可完成任务
n > 1 时,需要 (2^n -1) 次,该算法的时间效率为O(2^n)
补充一句:
对时间效率为指数级的O(2^n)算法,以及数量级等同于O(2^n)的O(n!)算法,用现在的计算机处理无法得到结果
可以先通过3个盘子的hanoi游戏得出其算法步骤如下:
if n=1 , 直接将圆盘移到c棒
if n>1 ,
将A棒上的n-1个圆盘移到B棒上
将A棒上的1个圆盘移到C棒上
将B棒上的n-1个圆盘移到C棒上
(图:3个盘子时第一步和第二步如上图所示)
用Java的实现代码如下
package cn.myseu.test.hanoi; public class Hanoi { public static void main(String[] args) { hanoi(3,'A','B','C'); } /** * the implementation of hanoi, move all the plates from stick-src to stick-dest * @param n the amount of plates * @param src the first stick * @param assist the middle stick * @param dest the destination stick */ public static void hanoi(int n,char src,char mid,char dest){ if (n==1){ move(src,dest); } else{ //move n-1 plates from stick-src to stick-mid ,assisted by stick-dest hanoi(n-1,src,dest,mid); //move the left 1 plate to the stick-dest directly move(src,dest); //move the left n-1 plates from stick-mid to sitck-dest hanoi(n-1,mid,src,dest); } } public static void move(char src,char dest){ System.out.println("Move the plate from " + src +" to "+" dest "); } }
算法分析:
n = 1 时,只需要移动一次即可完成任务
n > 1 时,需要 (2^n -1) 次,该算法的时间效率为O(2^n)
补充一句:
对时间效率为指数级的O(2^n)算法,以及数量级等同于O(2^n)的O(n!)算法,用现在的计算机处理无法得到结果
相关文章推荐
- 判断101-200之间有多少个素数,并输出所有素数。
- 求最小公约数和最大公倍数
- 输入一串字符,判断英文字母,空格,数字及其他字符的个数
- 说下Fedora下把SpiderMonkey放入Eclipse内编译的过程
- 求a+aa+aaa+aaaa+...的值
- 让CPU占用率曲线听你指挥
- 自学v512工作室_刘伟_Java高端培训系列视频_log4j遇到的问题
- java 字符串倒叙
- java 汉字与ASCII码之间的转换
- spring(1)
- 编程之美--小飞--电梯调度算法 java实现
- java中常用的字符串的截取方法
- JAVA eclipse 问题汇总(持续更新)
- java客户端向服务端发post请求
- 用Struts2框架开发的菜鸟绝对能看得懂的用户登录程序(1)
- javamail发送邮件
- java输入输出流层次结构
- java中set/map/list/vector 的详解
- Eclipse文件编码设置的问题
- Ubuntu下jdk安装配置