图解
本图以三个盘子为例来说明问题
代码实现
public class Hano {
/*
* 假设现在64个盘子
*
* 前63个 从x->y 借助z
* 前62个 从x->z 借助y
* 前61个 从x->y 借助z
* .....
* 第62个 从x->z
* 前61个 从y->z 借助x
* ....
* 第63个 从x->y
* 前62个 从z->y 借助x
* ....
* 第64个 从x->z
* 前63个 从y->z 借助x
* 前62个 从y->x 借助z
* ...
* 第63个 从y->z
* 前62个 从x->z 借助y
* ...
* */
public static void main(String[] args) {
int N=30;
LinkedStack<Integer> stackX=new LinkedStack<>();
for(int i=N;i>=1;i--){
stackX.push(i); //先让这些盘子进栈
}
LinkedStack<Integer> stackY=new LinkedStack<>(); //定义栈Y
LinkedStack<Integer> stackZ=new LinkedStack<>();
move(stackX,stackY,stackZ,N); //用栈来实现移动盘子
System.out.println(stackX); //移动前X上的盘子
System.out.println(stackZ); //移动后Z上面的盘子
}
//x 源盘 y 借助盘 z目的盘
private static void move(LinkedStack<Integer> x, LinkedStack<Integer> y, LinkedStack<Integer> z, int level) {
if(level==1){ //level是盘子数
z.push(x.pop());//先从X盘出栈,最后从Y盘进栈
}else{
move(x,z,y,level-1); //X盘借助Z移动到Y盘
z.push(x.pop());
move(y,x,z,level-1); //Y借助X移动到Z盘
}
}
}