展示移动过程:
public static void main(String[] args) {
doTowers(3,'A','B','C');
}
public static void doTowers(int topN,char from,char inter,char to){
if (topN==1)
System.out.println("Disk 1 from "+from+" to "+to);
else {
doTowers(topN-1,from,to,inter);
System.out.println("Disk "+topN+" from "+from+" to "+to);
doTowers(topN-1,inter,from,to);
}
}
结果:
Disk 1 from A to C
Disk 2 from A to B
Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A
Disk 2 from B to C
Disk 1 from A to C
带元素节点移动的模型:
public class TowersApp {
static int nDisks=3;
public static void main(String[] args) {
Ta ta= new Ta("A");
for (int i=nDisks;i>0;i--){
ta.push(i);
}
doTowers(nDisks,ta,new Ta("B"),new Ta("C"));
}
public static void doTowers(int topN,Ta from,Ta inter,Ta to){
if (topN==1) {
System.out.println("Disk 1 from " + from.name + " to " + to.name);
to.push(from.pop());
show(from,inter,to);
}
else {
doTowers(topN-1,from,to,inter);
System.out.println("Disk "+topN+" from "+from.name+" to "+to.name);
to.push(from.pop());
show(from,inter,to);
doTowers(topN-1,inter,from,to);
}
}
private static void show(Ta from, Ta inter, Ta to) {
System.out.println(from.name+": "+from.list.toString());
System.out.println(inter.name+": "+inter.list.toString());
System.out.println(to.name+": "+to.list.toString());
System.out.println("----------------");
}
}
public class Ta {
String name;
Stack<Integer> list=new Stack<>();
public Ta(String a) {
this.name=a;
}
public void push(int node){
this.list.push(node);
}
public int pop(){
return this.list.pop();
}
public int getCount(){
return this.list.size();
}
}
运行结果:
Disk 1 from A to C
A: [3, 2]
B: []
C: [1]
----------------
Disk 2 from A to B
A: [3]
C: [1]
B: [2]
----------------
Disk 1 from C to B
C: []
A: [3]
B: [2, 1]
----------------
Disk 3 from A to C
A: []
B: [2, 1]
C: [3]
----------------
Disk 1 from B to A
B: [2]
C: [3]
A: [1]
----------------
Disk 2 from B to C
B: []
A: [1]
C: [3, 2]
----------------
Disk 1 from A to C
A: []
B: []
C: [3, 2, 1]
----------------