汉诺塔的java实现

汉诺塔问题描述:
假设有三个命名为X(TOWER 1),Y(TOWER 2),Z(TOWER 3)的塔座,在塔座X上有n个直径大小各不相同,依次从小到大编号为1,2,3,...,n的圆盘。现要求将X塔座上的n个圆盘移到Z塔座上并按同样顺序叠排,
圆盘移动时必须遵循下列规则:
1)每次只能移动一个圆盘;
2)圆盘可以插在X,Y,Z中的任意塔座上;
3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
[img]http://dl.iteye.com/upload/attachment/603825/64361151-14a6-33dc-affa-0c47e500629f.jpg[/img]

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);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值