用java面向对象的思想实现的汉诺塔问题
package hanoi.com;
public class Disc {
private String name;
private int level;
public Disc(){
name = "disc";
level = 0;
}
public Disc(String name, int level){
this.name = name;
this.level = level;
}
public String getName() {
return name;
}
public int getLevel() {
return level;
}
@Override
public String toString() {
return "name: " + this.name + ";level: " + this.level;
}
}
package hanoi.com;
import java.util.LinkedList;
import java.util.List; public class Post {
//用来装Disc
private List<Disc> lists = new LinkedList<Disc>();
private String name;public String getName() {
return name;
} public Post(String name) {
this.name = name;
} public void add(Disc disc) {
if(disc == null) return;
this.lists.add(0, disc);
} public void add(List<Disc> discs) {
if (discs == null || discs.size() < 1) {
return;
}
lists.addAll(0, discs);
}
//当前柱子中的盘子借助middlePost移到到targetPost
public void move(Post middlePost, Post targetPost,PostMove postMove){
this.move(this.lists.size(), middlePost, targetPost, postMove);
}
private void move(int total, Post post1, Post post2,PostMove postMove) {
if(total <= 0) return;
this.move(total - 1, post2, post1,postMove); Disc disc = this.lists.remove(0);
if(postMove != null){
postMove.action(this, post1,post2, disc);
}
post2.add(disc); post1.move(total -1 ,this, post2,postMove);
} @Override
public String toString() {
return "Post [lists=" + lists + ", name=" + name + "]";
}
}
package hanoi.com;
public interface PostMove {
public void action(Post scrPost,Post middlePost, Post targetPost, Disc disc);
}
package hanoi.com.test; import hanoi.com.Disc;
import hanoi.com.Post;
import hanoi.com.PostMove; public class Main { public static void main(String[] args) {
Post post1 = new Post("A");
Post post2 = new Post("B");
Post post3 = new Post("C"); post1.add(new Disc("3", 2));
post1.add(new Disc("2", 1));
post1.add(new Disc("1", 0)); System.out.println(post1);
System.out.println(post2);
System.out.println(post3); post1.move(post2, post3, new PostMove() { @Override
public void action(Post srcPost, Post middlePost,Post targetPost, Disc disc) {
System.out.println(disc + ":从"+ srcPost.getName() + "通过" + middlePost.getName() + "到达" + targetPost.getName());
}
});
System.out.println(post1);
System.out.println(post2);
System.out.println(post3);
} }
用java面向对象的思想实现的汉诺塔问题的更多相关文章
- C#中汉诺塔问题的递归解法
百度测试部2015年10月份的面试题之——汉诺塔. 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔. 百度百科在此. 游戏试玩在此. 用递归的思想解决汉诺塔问题就是分 ...
- python实现汉诺塔程序
# 汉诺塔思想笔记# 认识汉诺塔的目标:把A柱子上的N个盘子移动到C柱子# 递归的思想就是把这个目标分解成三个子目标# 子目标1:将前n-1个盘子从a移动到b上# 子目标2:将最底下的最后一个盘子从a ...
- java面向对象的思想(java三大特性)
用通俗易懂的语言来理解java面向对象的思想 大家都知道,java是面向对象的编程,掌握面向对象的编程思想是掌握java编程语言的核心,但是很多人在面向对象方面都存在或多或少的误区,有的是刚学完C语言 ...
- java实现组合数_n!_杨辉三角_组合数递推公式_回文数_汉诺塔问题
一,使用计算机计算组合数 1,设计思想 (1)使用组合数公式利用n!来计算Cn^k=n!/k!(n-k)!用递推计算阶乘 (2)使用递推的方法用杨辉三角计算Cn+1^k=Cn^k-1+Cn^k 通过数 ...
- 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...
- 编程:递归编程解决汉诺塔问题(用java实现)
Answer: //Li Cuiyun,October 14,2016. //用递归方法编程解决汉诺塔问题 package tutorial_3_5; import java.util.*; publ ...
- java 解决汉诺塔问题
//汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void ...
- Java汉诺塔算法
汉诺塔问题[又称河内塔]是印度的一个古老的传说. 据传开天辟地之神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把 ...
- java 中递归的实现 以及利用递归方法实现汉诺塔
今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...
随机推荐
- 制作按钮(Button)
按钮的核心作用 1.按钮能接收单击并触发响应事件. 2.按钮被单击时能同时触发多个响应事件. 3.按钮可以有普通.悬停.单击.禁用等多个状态的不同表现. 4.广泛的说,按钮的核心在于接收事件,任何可以 ...
- 长达半年的苹果发布会:亮点与槽点(iPhone5s,iPhone5c)
不知出于什么原因,今天凌晨召开的苹果发布会并没有视频直播,所以大家都守着The Verge家的图文直播.结果,苹果再一次用事实证明了他们没有保密体系,或者,故意没有保密体系. 整场发布会正经的亮点如下 ...
- opencv 操作本地摄像头实现录像
直接上代码: // demo1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...
- 对CURL的一些研究
http://www.kuqin.com/article/23candcplusplus/586014.html 前两天看到有人求客户端socket 发HTTP包的代码,受flw版主启发找了一些per ...
- KMP的next[]数组
KMP是众多字符串问题的基础 理解next数组尤为重要 next又称前缀数组 是 它所处位置的前一个位置的元素 与 该链 链首开始 几个元素相匹配(即相同) 举个实例来说明: next对应的是该位置的 ...
- Joda-Time
任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完成这项任务将非常痛苦和繁琐.现在来看看 Joda Time,一 ...
- Spring事务传播机制
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务 ...
- c#使用XSLT将xml文档转换为html文档
需要引用下面的命名空间: using System.Xml; using System.Xml.Xsl; 方法实现: public static string ConvertXML(XmlDocume ...
- tlplayer for wince 版本正式商用
开始的时候tlplayer遇到一些问题,后来经过一些简单优化后,可以满足商用条件. 支持http,mms,rtsp等网络协议,支持内存流播放.需要定制或者需要支持hls,rtmp,m3u8等协议的,请 ...
- PO > Create PO时关于汇率问题需要注意的步骤
为了使得RMB采购的PO在审核时不会提示汇率丢失(如下图),在创建PO时需要注意几个步骤. 1)手动创建PO:在建立PO行之前,应该选择好正确的"地点","币 ...