Topic: In the classic problem of the Towers of Hanoi, you have 3 rods and N disks of different sizes which can slide onto any tower. The puzzle starts with disks sorted in ascending order of size from top to bottom (e.g., each disk sits on top of an even larger one). You have the following constraints:
1)Only one disk can be moved at a time.
2)A disk is slid off the top of one rod onto the next rod.
3)A disk can only be placed on top of a larger disk.
Write a program to move the disks from the first rod to the last using Stacks
// 方法1:递归
moveDisks(int n, Tower from, Tower to, Tower buffer){
1)move top n-1 disks from from to buffer;(Recursion)
2)move disk n from from to to;
3)move n-1 disks from buffer to to;
}
// 用LinkedList来表示Tower
import java.util.LinkedList;
public class Tower {
private LinkedList<Integer> tower;
public Tower() {
tower = new LinkedList<Integer>();
}
public boolean add(int disk) {//把每个子塔搭起来
if (tower.isEmpty() || tower.peek() > disk) {
tower.push(disk);
return true;
}
return false;
}
public boolean moveTo(Tower to) {//只把最上面的移一次
if (tower.isEmpty()) {
return false;
}
return to.add(tower.pop());
}
// toString是Object类的方法,LinkedList继承,returns a string representation of this collection.
//这个方法在这里并不需要,LinkedList直接就能打印
public String toString() {
return tower.toString();
}
}
public class TowersOfHanoi {
public static void moveDisks(int n, Tower from, Tower to, Tower buffer) {
// n==1,是上一个子循环结束的条件;n==0,是这个方法结束的条件。
if (n == 0) {//这是不正常情况,n是不能为0的,根本不用移,跟n不能小于0一样。
return;
}
if (n == 1) {// 这是结束情况,最后剩一块了,移它就行
from.moveTo(to);
return;
}
moveDisks(n - 1, from, buffer, to);
from.moveTo(to);
moveDisks(n - 1, buffer, to,from);
}
public static void main(String[] args){
Tower from=new Tower();
Tower to=new Tower();
Tower buffer=new Tower();
for(int i=4;i>=0;i--){
from.add(i);
}
System.out.println(from.toString());
System.out.println(buffer.toString());
System.out.println(to.toString());
moveDisks(5,from,to,buffer);
System.out.println(from.toString());
System.out.println(buffer.toString());
System.out.println(to.toString());
}
}
//结果
[0, 1, 2, 3, 4]
[]
[]
[]
[]
[0, 1, 2, 3, 4]