⭐前言⭐
※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入学习模式。若有错误,请多多指教。
👍 点赞 ⭐ 收藏 📝留言 都是我创作的最大的动力!
⭐目录⭐
1.汉诺塔
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
欲知历史起源及其他相关知识,可移步百度
2.解题思路
2.1一个圆盘
图源:百度图片,侵删
移动路径:step1:A-->C
移动步数:1(2^1 - 1)
2.2两个圆盘
图源:百度图片,侵删
移动路径:step1:A-->B step2:A-->C step3:B-->C
移动步数:3(2^2-1)
2.3三个圆盘
图源:百度图片,侵删
移动路径:
step1:A-->C step2:A-->B step3:C-->B step4:A-->C step5:B-->A step6:B-->C
step7:A-->C
移动步数:7(2^3-1)
2.4 n个圆盘
移动步数:(2^n - 1)
思路:我们使用递归的方法解决问题
第一步:把A上的最下面一个移动到C上,需要把前n-1个圆盘放到B上面去,然后把第n个圆盘从A移动到C
第二步:把B上的最下面一个移动到C上,需要把前n-2个盘放到A上面去,然后把第n-1个圆盘从B移动到C
第三步:把A上的最下面一个移动到C上,需要把前n-3个圆盘放到B上面去,然后把第n-2个圆盘从A移动到C
……
第n步:把仅剩的一个移动到C上;
3.项目源码:
public class Hanoi {
private static int count = 0;
public static void move(char pos1, char pos2){
count++; //记录步数
//打印路径
System.out.printf("step%2d:",count);
System.out.print(pos1 + "-->" + pos2 + " ");
//每8个一行
if(0 == count % 8) {
System.out.println();
}
}
/**
* //汉诺塔问题
* @param n 汉诺塔盘数
* @param pos1 起始位置
* @param pos2 中间位置
* @param pos3 目标位置
*/
public static void hanoi(int n, char pos1, char pos2, char pos3){
//如果只有一个圆盘,把pos1(起始位置)上的圆盘移动到pos3(目标位置)上
if(n == 1) {
move(pos1, pos3);
}else {
//下面的n代表形参n,不是指一共有多少圆盘
//把前n - 1个圆盘移到中间位置,使第n个圆盘能够移动到目标位置
hanoi((n - 1),pos1,pos3,pos2);
//把第n个圆盘移动到目标位置
move(pos1, pos3);
//把前n - 1个圆盘移到目标位置
hanoi((n-1), pos2,pos1,pos3);
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNextLine()){
count = 0;
int n = scan.nextInt();
System.out.print(n + "个圆盘: ");
hanoi(n, 'A', 'B', 'C');
System.out.println();
}
}
}
输出结果:
1 2 3 4
1个圆盘: step 1:A-->C
2个圆盘: step 1:A-->B step 2:A-->C step 3:B-->C
3个圆盘: step 1:A-->C step 2:A-->B step 3:C-->B step 4:A-->C step 5:B-->A step 6:B-->C step 7:A-->C
4个圆盘: step 1:A-->B step 2:A-->C step 3:B-->C step 4:A-->B step 5:C-->A step 6:C-->B step 7:A-->B step 8:A-->C
step 9:B-->C step10:B-->A step11:C-->A step12:B-->C step13:A-->B step14:A-->C step15:B-->C
更多有趣的代码请移步小森的Gitee仓库Gitee