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面向对象的思想实现的汉诺塔问题的更多相关文章

  1. C#中汉诺塔问题的递归解法

    百度测试部2015年10月份的面试题之——汉诺塔. 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔. 百度百科在此. 游戏试玩在此. 用递归的思想解决汉诺塔问题就是分 ...

  2. python实现汉诺塔程序

    # 汉诺塔思想笔记# 认识汉诺塔的目标:把A柱子上的N个盘子移动到C柱子# 递归的思想就是把这个目标分解成三个子目标# 子目标1:将前n-1个盘子从a移动到b上# 子目标2:将最底下的最后一个盘子从a ...

  3. java面向对象的思想(java三大特性)

    用通俗易懂的语言来理解java面向对象的思想 大家都知道,java是面向对象的编程,掌握面向对象的编程思想是掌握java编程语言的核心,但是很多人在面向对象方面都存在或多或少的误区,有的是刚学完C语言 ...

  4. java实现组合数_n!_杨辉三角_组合数递推公式_回文数_汉诺塔问题

    一,使用计算机计算组合数 1,设计思想 (1)使用组合数公式利用n!来计算Cn^k=n!/k!(n-k)!用递推计算阶乘 (2)使用递推的方法用杨辉三角计算Cn+1^k=Cn^k-1+Cn^k 通过数 ...

  5. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

  6. 编程:递归编程解决汉诺塔问题(用java实现)

    Answer: //Li Cuiyun,October 14,2016. //用递归方法编程解决汉诺塔问题 package tutorial_3_5; import java.util.*; publ ...

  7. java 解决汉诺塔问题

    //汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void ...

  8. Java汉诺塔算法

    汉诺塔问题[又称河内塔]是印度的一个古老的传说. 据传开天辟地之神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把 ...

  9. java 中递归的实现 以及利用递归方法实现汉诺塔

    今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...

随机推荐

  1. .net entity framework 泛型 更新与增加记录

    static public bool SaveOrUpdate<T>(T entity) where T: class { bool result = false; using (wech ...

  2. SpringMVC最基础配置

    SpringMVC和Struts2一样,是前后台的一个粘合剂,struts2用得比较熟悉了,现在来配置一下SpringMVC,看看其最基础配置和基本使用.SpriingMVC不是太难,学习成本不高,现 ...

  3. POj 2186 Popular Cows[连通分量]

    题目大意:给出N头牛,有M种关系u, v.代表u牛崇拜v牛.要求找出有多少头牛被所有牛崇拜着题目链接:http://poj.org/problem?id=2186解题思路:1>求出强连通分量,标 ...

  4. python image模块

    Image 模块 Image 模块提供了同名的类用来表示PIL的图像.Image模块还提供了许多工厂(factory)函数,包块从文件加载图像的函数,以及创建新图像的函数.    例子  下面的脚本加 ...

  5. simplemodal — jquery弹出窗体插件

    方式一:使用jquery-1.7.1.min.js(1.9.1的版本我试过了,不行) + jquery_modal.js的方式 文件:        testModel.css: /* Overlay ...

  6. Django单元测试(二)------测试工具

    The test client test client是一个python类,来模拟一个简单的“哑”浏览器,允许你来测试你的view函数.你可以使用test client完成下列事情: 1.模拟&quo ...

  7. PHP remove,empty和detach区别

    empty: 把所有段落的子元素(包括文本节点)删除 HTML 代码: <p>Hello, <span>Person</span> <a href=" ...

  8. 学习笔记-[Maven实战]-第三章:Maven使用入门(2)

    使用maven执行编译和测试 1.maven执行编译 (1).在pom.xml上点右键,选择Maven build... (2).在Goals里输入clean complie,执行编译 执行结果: [ ...

  9. Visual Studio Solution Configuration

    https://msdn.microsoft.com/en-us/library/bb166577.aspx Solution configurations store solution-level ...

  10. Android开发之bindService()侦听service内部状态

    在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 p ...