用java写出汉诺塔游戏的玩法
首先我们需要知道什么是汉诺塔游戏?
汉诺塔是根据一个传说形成的一个问题。汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
做这个之前我们考虑一下
如果圆盘只有一个:那我们只需要直接将A上的圆盘放置到B上面
H(1):A--》B 一次
如果A上有两层圆盘:
我们的移动方法是:A->C A->B C->B 就完成了
H(2):3次
如果A上有3层圆盘 我们的移动方法如下:
A->B A->C B->C A->B C->A C->B A->B
H(3):7次
H(2)怎么看 A->C A->B C->B
----------- --------- ------------
将A上一层移到C圆盘上去 将最底层移到B上 将C盘上的一层移动过去
H(3)怎么看 A->B A->C B->C A->B C->A C->B A->B
------ -------- -------- --------- ----------- -----------
这里又可以看作H(2) 将C作为目标盘移动过去 将B作为目标盘移动过去
--------------------------------------- ---------- --------------------------------------------------------------
A的最上面两层移到了C上 最底层移到B上 又将C上面的两层移到B上
如果我想将A盘上的圆盘依照游戏法则移动到B盘上去 就需要将A盘除了最后一层的上面层移动到C盘 然后将最底层移动到B盘 这时我们的目标又变成了将C盘的圆盘移动到B盘上去了,所以我们依照之前的方法将C盘除底层的圆盘移动到A盘上去将最后一层移动到B盘 这是我们就移动到B盘两层了,方法以此类推 逐步将A盘上的东西移动到B盘上去。
总结一下移动的次数:1 ,3, 7, 15 ,31 ,63
怎么来的? 由第二层我们可以知道 看作三个1层的移动:所以就时3
第三层 两个二层的移动 加上一个一层的移动就是 2*3+1=7
同理:第四层:两个三层的移动加上一个一层的移动:2*7+1=15;
第五层:2*15+1=31;
第六层:2*31+1=63;
1:1 2:3 3:7 4:15 5:31 6:63
我们可以看出层数与次数的关系是:2^n-1(n表示层数)
次数的算法就是这样,现在我们看看程序如何来表达这个过程
这里我们可以看出:我们可以将移动盘递归地推到第一层去
这里我们定义的是将A为开始盘面 B为结束盘面
public class HanoTowers {
public static int count;//移动的次数
public static void main(String[] args) {
hanoTowersMove(6,"A","B","C");
System.out.println(count);
}
//x为开始盘面 y为结束盘面
private static void getHanoTowersMove(int n, String x, String y, String z) {
if(n>0) {
//首先我们需要将出发盘面除底层外的上几层的东西放在除了目标盘的另一个盘上面去
hanoTowersMove((n-1), x, z, y);
count=count+1;
//这里表示最后一层的移动
System.out.println(x+"-->"+y);
//将出发盘移动到另一个盘上面的圆盘移动到最终目标盘上去
hanoTowersMove((n-1), z, y, x);
}
}
}
最后展示一下我们的运行结果: