有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
每次只能移动一个圆盘;
大盘不能叠在小盘上面。
提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
问题分析:
当只有一个盘子时 盘子编号为1,
直接将编号为1的盘子从A移动到C
表示为如下:
1:A–>C
当有2个盘子时,盘子编号为2和1,其中2在1下面,编号越大表示盘子越大。
1:A–> B
2:A–>C
1:B–>C
当有3个盘子时,编号3 2 1,这样移动:
(1~2):A-C->B
3:A–>C
(1~2):B-A->C
其中,(1~2):A-C->B表示将编号从1到2的盘子从A移动到B,其中移动的过程需要借助C来临时存放盘子。
当有n个盘子时,编号n,n-1,……3 2 1,这样移动:
(1~n-1):A-C->B
n:A–>C
(1~n-1):B-A->C
翻译成代码就是:
//将n个盘子从 A借助B移动到C
static void move(int n, String A,String B,String C) {
if (n == 1) {
//将第n个盘子从 A 移动到 C
singleStep(n, A, C);
} else {
move(n-1, A, C, B);
singleStep(n, A, C);
move(n-1, B, A, C);
}
}
完整代码如下:
public class HanNuo {
static int steps = 0;
static int N = 2;
public static void main(String[] args) {
move(N, "A", "B", "C");
}
//将n个盘子从 src借助between移动到 dest
static void move(int n, String src,String between,String dest) {
if (n == 1) {
singleStep(n, src, dest);
} else {
move(n-1, src, dest, between);
singleStep(n, src, dest);
move(n-1, between, src, dest);
}
}
//将第n个盘子从 src 移动到 dest
static void singleStep(int n, String src, String dest) {
steps++;
System.out.printf("第%d步,第%d个盘子:%s-->%s\n",steps,n,src,dest);
}
}
当N=2时,运行结果:
当N=3时,运行结果: