手把手带你用java搞定汉诺塔

网友投稿 274 2022-10-07


手把手带你用java搞定汉诺塔

目录什么是汉诺塔问题剖析n=1n=2n=3小结java代码实现代码讲解move函数hanoiTower函数附:C语言实现汉诺塔总结

什么是汉诺塔

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。

大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

问题剖析

我们假设圆盘数量为n,圆盘初始放TXzXc在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','TXzXcC');

}

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);

}

TXzXc

src表示起始圆盘所在的柱子,des表示该圆盘需要移动到的柱子。

hanoiTower函数

public static void hanoiTowTXzXcer(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("\n");

}

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;

}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:逻辑漏洞之越权漏洞(故意的漏洞)
下一篇:正则表达式笔记
相关文章

 发表评论

暂时没有评论,来抢沙发吧~