什么是汉诺塔
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
问题剖析
我们假设圆盘数量为n,圆盘初始放在A柱上,最后移到C柱。
n=1
移动方法:A -> C
n=2
移动方法:A -> B A -> C B -> C
n=3
移动方法:A -> C A -> B C -> B A -> C B -> A B -> C A -> C
小结
通过这上面三个情况,我们可以知道:
- 当红色圆盘上面没有其他圆盘的时候,就直接把红色圆盘移到C柱上。
- 当红色圆盘上面有其他圆盘的时候,先把其他圆盘移到B柱上,然后再将红色圆盘移到C柱上。在把B柱上紫色圆盘上面的其他圆盘移到A柱,接着再将紫色圆盘移到C柱上。然后再次循环。
例如当n=4时,
Java代码实现
public class TestDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); hanoiTower(n,"A","B","C"); } public static void hanoiTower(int n,char A,char B,char C) { if(n < 2) { move(A,C); } else { hanoiTower(n - 1,A,C,B); move(A,C); hanoiTower(n - 1,B,A,C); } } public static void move(char src,char des) { System.out.println(src + " -> " + des); } }
例如输入3,结果为:
代码讲解
move函数
public static void move(char src,char des) { System.out.println(src + " -> " + des); }
src表示起始圆盘所在的柱子,des表示该圆盘需要移动到的柱子。
hanoiTower函数
public static void hanoiTower(int n,char A,char B,char C) { if(n < 2) { move(A,C); } else { hanoiTower(n - 1,A,C,B); move(A,C); hanoiTower(n - 1,B,A,C); } }
hanoiTower的第一个参数,代表还有n个圆盘需要移动,A代表起始圆盘所在的柱子,C代表该圆盘所要移动到的柱子,B代表圆盘移动时所经历的中间柱子。
例如n=3时,先需要把上面两个圆盘经过一系列的移动,全部移动到B柱上,所以就得调用hanoiTower(2,A,C,B);然后再将A柱上唯一的一个圆盘移动到C柱上,所以调用move(A,C);然后再将B柱上除最下面的圆盘以外的圆盘移动到A柱上,然后再重复这个步骤,直到所有的圆盘都移动到C柱为止。
所以调用hanoiTower(2,B,A,C);
附:C语言实现汉诺塔
#include<stdio.h> void Move(char src, char des) { printf("%c -> %c", src, des); printf(" "); } void HanoiTower(int n, char A, char B, char C) { if (n == 1) { Move(A, C); } else { HanoiTower(n - 1, A, C, B); Move(A, C); HanoiTower(n - 1, B, A, C); } } int main() { int n = 0; scanf("%d", &n); HanoiTower(n, "A", "B", "C"); return 0; }
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/m0_53408775/article/details/119424483