汉诺塔问题是一个经典的问题。汉诺塔(HanoiTower),又称河内塔,源于印度一个古老传说。本文将用JavaSE求解这一问题,感兴趣的可以学习一下
1.问题描述
汉诺塔问题是一个经典问题。河内塔,又称河内塔,源于一个古老的印度传说。
梵天创造世界的时候做了三根钻石柱子,柱子上自下而上叠放了64个黄金圆盘。
梵天命令梵天从下面按大小顺序重新排列另一根柱子上的圆盘。
而且规定任何时候都不能在小盘上放大盘,一次只能在三列之间移动一个盘。请教如何操作?
2.画图分析
盘的情况:在移动之前
移动后
1板块:A直接移动到c。
两个磁盘的情况:移动之前
移动后
2碟:A-gt;b A-gt;c B-gt;C
三个盘的情况:在移动之前
移动后
三盘:A-gt;c A-gt;b C-gt;b A-gt;c B-gt;一辆B-gt;中文翻译公司
3.问题讲解
当有三个盘子时,你会发现一个问题。你必须先把上面的两块板移到B列,然后把下面的板移到C列,最后把板从B列移到C列,四块板也是一样。首先把上面的三块板移到B列,然后把下面的板移到C列,最后把板从B列移到C列,于是我们有了一个想法。不管有几块板,都要先把n-1块板移到B列,再把底板移到C列,最后把B列的板移到C列。
我们先来看看规则:
1板:A-gt;c次
2板块:A-gt;b A-gt;c B-gt;c次
3板:A-gt;c A-gt;b C-gt;b A-gt;c B-gt;一辆B-gt;C A-C 7次
所以你可以看到移动的次数实际上是2 n-1 (n是盘子的数量)
4.代码实现ublic class TestDemo { //首先要写个模拟鼠标移动过程的函数,我们要打印出移动的全部过程 //这个move函数做到的就是从1位置移动到2位置,有可能是A-gt;B,A-gt;C,C-B......等各种可能 public static void move(char pos1,char pos2){//所以说这里只需要传对应的位置就可以了 System.out.print(pos1+"-gt;"+pos2+" ");//pos1移动到pos2 } /** * * @param n n代表你盘子的个数 * @param pos1 盘子所在的位置 * @param pos2 盘子的中转位置 * @param pos3 盘子的结束位置 */ public static void hanio(int n,char pos1,char pos2,char pos3){ if(n == 1){ move(pos1,pos3);//如果只有一个盘子那就从A柱挪到C柱上 }else{ hanio(n-1,pos1,pos3,pos2);//这里是把n-1个盘子从A柱借助C柱移动到B柱 move(pos1,pos3);//底下剩下的最后一个盘子从A柱移动到C柱 hanio(n-1,pos2,pos1,pos3);//这里是把n-1个盘子从B柱借助A柱移动到C柱 } } public static void main(String[] args) { hanio(1,'A','B','C');//一开始我们的汉诺塔要规定一下,我们第一次给它传过去的位置 System.out.println(); hanio(2,'A','B','C'); System.out.println(); hanio(3,'A','B','C'); System.out.println(); } }
打印结果:
到目前为止,这篇关于Java SE解决Hanoi Tower问题的示例代码已经介绍到这里了。关于Java汉诺塔问题的更多信息
精彩评论