代码量不大,但是不容易理解。
想一想,一直递归一直递归,直到只有一个盘子的时候,那么剩下的最后一个盘子就是最小的盘子,直接放到3上面就行了,相当于只有一个盘子,从1柱移动到3柱。
代码解释:
Hanoi代表整个方法,n代表盘子的个数,1,2,3分别代表原始柱子,中间柱子,和目标柱子。
还有一点值得强调的是,形参中的from所在的位置代表要移动的盘子所在的柱子,cross代表需要借助该柱子移动的柱子,to代表需要移动到这个地方的柱子。
public class Test {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入盘子数目");
int n = s.nextInt();
hanoi(n,1,2,3);
}
public static void moveUnder(int from, int to) {
System.out.println(from + "移动到" + to);
}
//假设2柱是初始柱,3柱是目标柱
public static void hanoi(int n,int from, int cross, int to) {
if (n == 1) {
moveUnder(from, to);
} else {
//把除了最下面的盘子从1柱借助3柱移动到2柱
hanoi(n-1,from, to, cross);
moveUnder(from, to);
//把上面n-1个盘子从2柱借助1柱子移动到3柱子
hanoi(n-1,cross, from, to);
}
}
}
传过来的参数from=1,cross=2,to=3,代表1,2,3号柱。
hanoi(n-1,from, to, cross); 把上面的n-1个盘子从1号柱子,借助3号柱,移动到2号柱子,
moveUnder(from, to);把最下面的盘子从1柱移动到3柱,这里就不用借助另一个柱子了,因为只有一个盘子,直接移过去就好了
hanoi(n-1,cross, from, to);把上面n-1个盘子从2柱借助1柱子移动到3柱子