代码界的小学生,有不足之处或更好的方法欢迎在评论区指正或分享
本人是看b站韩顺平老师的视频,然后把一些个人理解写了进来
老师视频:P226 0225_韩顺平Java_汉诺塔
题目:
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
me: 不得不佩服自己想出这题的人😳,想了一下午还是没想透。
上代码吧:
public class Main {
public static void main(String[] args) {
Text(4,'A','B','C');
}
//num 表示要移动的个数,a,b,c分别表示A塔,B塔,C塔
public static void Text(int num,char a,char b,char c) {
//如果只有一个盘 num = 1
if(num == 1) {
System.out.println(a + "-->" + c);
}else {
//如果有多个盘,可以看成两个,最下面和上面的所有盘(num - 1)
//1)先移动上面所有的盘到 b ,借助 c
Text(num - 1,a,c,b);
//2)把最下面的这个盘,移动到 c
System.out.println(a + "-->" + c);
//3)再把 b塔 的所有盘,移动到c,借助a
Text(num - 1,b,a,c);
}
}
}
到晚上在想起时能理清一些思路,但还是感觉少了什么东西…👨–>🧑🦲,离秃头不远了
然后这是视频中大佬发的思路(红字),太牛了👍
图片有点乱,我就复制一遍过来了
1. 形参 abc 不是固定对应 实参ABC 三根柱子,而是 '起始' 、'过度'、 '终点' 三根柱子
2. '起始' 、'过度'、 '终点' 是 形参!形参!形参!
3. 不同情况下 我们的 起始 过度 终点 是不同的
4. else 代码块中的内容:
4.0 起始问题 A上的 num 挪到 C ,BC为空 可以任意挪动
4.1 A上面的一摞(num-1)挪到 B ,所以 '起始'=A 、'过度'=C、 '终点'=B
4.2 不解释 常规 A(底下&最大) ->C
4.3 B上面的一摞(num-1)挪回 A , 所以 '起始'=B 、'过度'=C、 '终点'=A
5.0 (num-1)挪回 A 之后,之前A最底下的 已经挪到C 最底下了
5.1 目前C 上面的为最大,不影响 AB 移动,可以理解为空
5.2 现在问题回到了 4.0 A上的num-1 挪到 C ,BC为空 可以任意挪动
5.3 循环完成游戏
最后是我画的一张传参为(3,‘A’,‘B’,‘C’);的流程图,一下午算唯一拿得出手的东西