您的位置:首页 > 其它

汉诺塔问题

2015-12-09 13:48 330 查看
有三根杆子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时,运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: