解决汉诺塔问题(java代码)
目录
1.简介
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。 传说中,大梵天创造世界时,做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
2.解决思路
现在有3根柱子分别为A,B,C,把A塔上的圆盘从大到小依此挪到C塔上去
代码实现:我们首先可以定义A塔上的圆盘个数为n个(数量不同,移动次数不同)
import java.util.Scanner;
public class Tower {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();//输入A塔上的圆盘个数
play game = new play();//创建变量game
//play为新创建的类,完整代码有体现
game.Hanoitower(num,"A","B","C");//Hanoitower为实现游戏的具体方法。A,B,C是三个塔,用字符来表示。
}
}
1.一个圆盘
如上图,仅需要移动一次,即直接从A塔挪到C塔。
//创建方法Hanoitower,接收n和字符A,B,C
public void Hanoitower(int num,String A,String B,String C) {
if(num == 1) {
//只有一个圆盘。
System.out.println(A+"-->"+C);//把A上的圆盘直接挪到C上去。
}
2.多个圆盘
如上图,A塔借助B塔移动了3次把圆盘全部移动到了C塔上,大于两层塔时借助C塔把除底部塔以外的塔(看成一个整体)挪到B塔上。
我们将这两个塔看成两部分(多个塔的拆分思路),最底层的塔和底层以上的塔。
public void Hanoitower(int num,String A,String B,String C) {
if(num == 1) {
//只有一个圆盘。
System.out.println(A+"-->"+C);//把A上的圆盘直接挪到C上去。
} else {
//大于一个圆盘
//首先借助C塔,把A塔上除最后一个圆盘以外的其他圆盘挪到B塔上。
Hanoitower(num-1,A,C,B);
//把A塔最后一个圆盘挪到C塔上
System.out.println(A+"-->"+C);
//利用A塔,把B塔上的圆盘挪到C塔上。
Hanoitower(num-1,B,A,C);
//共挪动了2的num次方减一次
}
}
仔细分析一下这个代码的执行
1.当n=2时,num=2,执行else语句
2.a.进入函数 Hanoitower(num-1,A,C,B),此时num = 1
此时将A赋给A,C赋给B,将B赋给C;
进入函数执行System.out.println(A+"-->"+C), 输出A--B
b.执行 System.out.println(A+"-->"+C),输出A-->C
c.执行函数 Hanoitower(num-1,B,A,C),此时num = 1
与a同理,进入函数执行执行System.out.println(A+"-->"+C),输出B-->C
3.完整代码
以上就是解决汉诺塔的全部思路,下面放入完整代码
import java.util.Scanner;
public class Tower {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
play game = new play();
game.Hanoitower(num,"A","B","C");
}
}
class play {
public void Hanoitower(int num,String A,String B,String C) {
if(num == 1) {
//只有一个圆盘。
System.out.println(A+"-->"+C);//把A上的圆盘直接挪到C上去。
} else {
//大于一个圆盘
//首先借助C塔,把A塔上除最后一个圆盘以外的其他圆盘挪到B塔上。
Hanoitower(num-1,A,C,B);
//把A塔最后一个圆盘挪到C塔上
System.out.println(A+"-->"+C);
//利用A塔,把B塔上的圆盘挪到C塔上。
Hanoitower(num-1,B,A,C);
//共挪动了2的num次方减一次
}
}
}
有问题请在评论区留言,觉得有用的朋友可以点个赞支持一下。