汉诺塔由安装在一个板上的3根柱子和若干大小不同的盘子构成。开始时,
这些盘子按照大小的次序放在第一根柱子上,大盘子在底下。游戏规则是:
每一次把1个盘子从一根柱子移动到另一根柱子,但是不允许这个盘子放在
比它小的盘子上面。游戏的目标是把所有的盘子按照大小次序都放到第根柱
子上,并且将最大的盘子放在底部。
1. 汉诺塔可以通过使用递推关系构造模型,递归算法实现。其中移动次数Hn=2Hn–1 + 1=2*exp(2)–1移动次数完成移动。
2. 总共有A,B,C 3根柱子,初始盘子按大小堆叠在A柱,目标把盘子由A柱移动到B柱,C为中间柱子。
以下是汉诺塔递归函数JAVA代码实现:
/*
* @param n: 需移动汉诺塔盘碟的数目(n>=2)
* @param A: 初始盘碟所在柱子
* @param B: 目标移动的柱子
* @param C: 中间柱子
*/
static void HanNuoTaMove(int n, char A, char B, char C){
// 递归基础(初始)实现
if(n==2){
System.out.println("1号盘子由:"+A+"柱子移动到:"+C+"柱子");
System.out.println("2号盘子由:"+A+"柱子移动到:"+B+"柱子");
System.out.println("1号盘子由:"+C+"柱子移动到:"+B+"柱子");
return;
}
//把n个盘子看成成n和n-1两个盘子, n-1个盘子看成一个整体进行移动
//先把n-1这个盘子移动到C柱上,B柱做为中间桥梁柱子(递归调用实现)
HanNuoTaMove(n-1, A, C, B);
//n号盘子移动到目标B柱上
System.out.println(n+"号盘子由:"+A+"柱子移动
到:"+B+"柱子");
//再把n-1个柱子从中间桥梁柱子移动到目标B柱上(递归调用实现)
HanNuoTaMove(n-1, C, B, A);
}
以下是通过栈的方式JAVA代码实现:
/**
* 汉诺塔栈(Stack)实现
* @param A: 初始堆叠盘子栈
* @param B: 目标堆叠盘子栈
* @param C: 中间桥梁盘子栈
*/
static void HanNuoTaStack(int n, Stack<Integer> A, Stack<Integer> B, Stack<Integer> C){
if(n==2){
C.push(A.pop());
B.push(A.pop());
B.push(C.pop());
return;
}
HanNuoTaStack(n-1, A, C, B);
B.push(A.pop());
HanNuoTaStack(n-1, C, B, A);
}