目录
📖汉诺塔简介
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
🙈汉诺塔问题
现在有三根柱子,分别为A、B、C,现在在A柱子上有64个盘子,大小不一样,大盘子在下边,小盘子在上边。现在需要把64个盘子挪到C柱子上,请问怎样挪动,需要多少次才能完成?
💡问题分析
1️⃣1个盘子
首先我们不去考虑64个盘子,我们来看一个盘子的情况
➡️直接挪(A------>C)只需要1次(2^1-1):
2️⃣2个盘子
➡️A------>C A------->B B-------->C 只需要3次(2^2-1)
3️⃣3个盘子
➡️A------>C A------->B C-------->B A------>C B------->A B-------->C A-------->C 只需要7次(2^3-1)
👉总结
当有64个盘子时,需要挪动2^64-1,这是一个庞大的数字,这时候就需要我们使用计算机程序来实现这个数字。
当有n个盘子,现在想办法的是,把n-1个盘子放在B上,把第n个盘子放在C上,最后把n-1个盘子放在C上。
📝代码实现【java】
//汉诺塔
//一个盘子 A---->C 1
//两个盘子 A---->B A----->C B---->C 3
//三个盘子 A---->C A----->B C----->B 7 2^N - 1
//64 2^64-1
/*
*
* @param n
* @param pos1 起始位置
* @param pos2 中转位置
* @param pos3 目的位置
*/
public static void Hanoi(int n, char pos1, char pos2, char pos3) {
if(n == 1) {
move(pos1, pos3);
return;
}
Hanoi(n-1, pos1, pos3, pos2);//n-1个盘子从pos1借助pos3移动到pos2中:pos1----->pos3
move(pos1, pos3);//第n个盘子从挪到pos3中
Hanoi(n-1, pos2, pos1, pos3);//n-1个盘子从pos2借助pos1到pos3中
}
public static void move(char pos1, char pos2) {
System.out.print(pos1 + "->" + pos2 + " ");
}
public static void main(String[] args) {
Hanoi(1,'A', 'B', 'C');
System.out.println();
Hanoi(2,'A', 'B', 'C');
System.out.println();
Hanoi(3,'A', 'B', 'C');
}