汉诺塔问题描述:
假设有三个命名为X(TOWER 1),Y(TOWER 2),Z(TOWER 3)的塔座,在塔座X上有n个直径大小各不相同,依次从小到大编号为1,2,3,...,n的圆盘。现要求将X塔座上的n个圆盘移到Z塔座上并按同样顺序叠排,
圆盘移动时必须遵循下列规则:
1)每次只能移动一个圆盘;
2)圆盘可以插在X,Y,Z中的任意塔座上;
3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
public class Hanoi{
//塔
class Tower<E> {
//塔编号
private int number;
//塔名称
private String name;
//存放盘子的栈
private Stack<E> stack = new Stack<E>();
public Tower(int number,String name) {
this.number = number;
this.name = name;
}
public int getNumber() {
return number;
}
public String getName() {
return name;
}
public Stack<E> getStack() {
return stack;
}
}
//盘子
class Tray {
//盘子编号
private int number;
//盘子名称
private String name;
public Tray(int number,String name) {
this.number = number;
this.name = name;
}
public int getNumber() {
return number;
}
public String getName() {
return name;
}
public String toString() {
return name;
}
}
public <T> void hanoi(int num,Tower<T> from,Tower<T> middle,
Tower<T> to) {
if(num == 1) {
move(from,middle,to);
} else {
//将num-1个盘子从from塔上移到middle塔上
hanoi(num-1,from,to,middle);
//将第num个盘子移到to塔上
move(from,middle,to);
//将num-1个盘子从middle塔上移到to塔上
hanoi(num-1,middle,from,to);
}
}
private <E> void move(Tower<E> from,Tower<E> middle ,Tower<E> to) {
E tray = from.getStack().pop();
to.getStack().push(tray);
StringBuilder sb = new StringBuilder();
sb.append("=====================Hanoi.move()======================\n")
.append(" Move tray : ").append(((Tray)tray).getName())
.append(" from ").append(from.getName()).append(" to ")
.append(to.getName()).append("\n ")
.append(from.getName()).append(":").append(format(from)).append(",")
.append(middle.getName()).append(":").append(format(middle)).append(",")
.append(to.getName()).append(":").append(format(to));
System.out.println(sb.toString());
}
private <E> String format(Tower<E> tower) {
Iterator<E> i = tower.getStack().iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
while(i.hasNext()) {
sb.append(i.next().toString()).append(",");
}
sb.replace(sb.length()-1, sb.length(), "]");
return sb.toString();
}
public static void main(String[] args) {
Hanoi hanoi = new Hanoi();
Tower<Tray> from = hanoi.new Tower<Tray>(1, "1号塔");
Tower<Tray> middle = hanoi.new Tower<Tray>(2, "2号塔");
Tower<Tray> to = hanoi.new Tower<Tray>(3, "3号塔");
int num = 4;
for (int i = num; i >0; i--) {
Tray tray = hanoi.new Tray(i,i+"号盘子");
from.getStack().push(tray);
}
hanoi.hanoi(num, from, middle, to);
}
}
- 大小: 1.8 KB
分享到:
相关推荐
总的来说,汉诺塔Java实现是一个很好的实践案例,展示了如何使用递归解决复杂问题,以及如何在Java环境中创建简单的用户界面。这个项目可以帮助学习者理解递归算法的工作原理,同时也能提升他们在面向对象编程和GUI...
总的来说,汉诺塔问题的Java实现是学习和掌握递归算法的一个优秀实例,通过理解和编写这样的代码,开发者能够提升解决问题的能力,特别是在处理复杂数据结构和算法设计时。同时,这也是一个很好的练习,有助于提高...
汉诺塔Java实现帮助类
一个简单的汉诺塔的简单实现
在Java中实现汉诺塔的界面,我们可以使用图形用户界面(GUI)库,如Java Swing或JavaFX。Eclipse是一款广泛使用的Java集成开发环境,可以方便地创建和管理这样的项目。 首先,我们需要创建一个Java项目,然后在`src...
汉诺塔问题是一个经典的递归算法问题,源自印度的一个古老传说。...通过学习汉诺塔问题的Java实现,我们可以更好地理解和掌握递归算法及其在实际问题中的应用,这对于编程和问题解决能力的提升具有重要意义。
在本项目中,"汉诺塔 Java版(可实现鼠标拖动和自动演示)",开发者不仅实现了基础的汉诺塔问题的解决方案,还增加了交互性的功能,让用户可以通过鼠标拖动盘子进行操作,这涉及到Java图形用户界面(GUI)的设计。...
总结起来,Java实现的汉诺塔问题是一个典型的递归算法应用,它展示了如何通过分解问题并逐步解决来处理复杂任务。理解并实践这个算法有助于提升对递归、函数调用栈以及问题解决策略的理解,这些都是编程中不可或缺的...
汉诺塔是一个经典的递归问题,...通过阅读代码,我们可以看到如何将理论的汉诺塔算法与Java GUI编程结合在一起,实现了一个交互式的汉诺塔游戏。这对于学习Java编程、递归算法以及图形用户界面设计都是很好的实践案例。
汉诺塔游戏是一种经典的逻辑谜题,源自印度的...它不仅展示了如何用Java实现经典的逻辑问题,还展现了如何创建一个美观的用户界面与之交互。通过学习和理解这个项目,开发者可以提高自己的算法思维能力和GUI编程技能。
汉诺塔小游戏
汉诺塔是一个经典的递归问题,它通过Java编程语言实现能帮助学习者深入理解面向对象编程的概念和递归算法的应用。在这个课程设计中,学生将使用Java语言开发一个图形用户界面(GUI)来模拟汉诺塔游戏。 1. **设计...
根据提供的文件信息,我们可以分析并总结出以下与“汉诺塔演示程序 Java程序源代码”相关的知识点: ### 1. 汉诺塔问题简介 汉诺塔(Hanoi Tower)是一个经典的递归问题,源自一个古老的传说。传说中,在世界末日...
综上所述,这个程序实现了汉诺塔问题的解决方案,并通过 Java Swing 库构建了一个图形化的界面,使用户能够直观地看到汉诺塔问题的求解过程。通过分析这段代码,我们可以学习到如何使用 Java 进行基本的 GUI 开发...
这个Java程序不仅实现了汉诺塔问题的解决,还通过Swing构建了一个直观的图形界面来展示解决过程。通过上述分析,我们可以看出该程序涵盖了从问题定义到具体实现的各个方面,非常适合用来教学或学习递归算法及Java ...
总的来说,Java程序设计中的汉诺塔问题不仅展示了递归算法的应用,还涉及了GUI设计、多线程和定时器的使用,这些都是Java开发中非常重要的技能。通过这个玩家游戏,开发者不仅可以锻炼逻辑思维能力,还可以提升GUI...
汉诺塔的Java实现通常会使用递归算法,递归函数的基本思路是: - 如果只有1个圆盘,直接从起始柱移动到目标柱。 - 对于n个圆盘,首先将上面n-1个圆盘从起始柱通过目标柱移动到辅助柱。 - 然后将第n个圆盘从起始柱...
在Java平台上实现汉诺塔游戏,首先需要理解基础的面向对象编程概念,如类、对象、封装、继承和多态。下面是一些关键知识点: 1. **类的设计**:设计一个`Tower`类来表示汉诺塔中的柱子,它包含一个存储圆盘的列表,...