设为首页 加入收藏

TOP

Hanoi问题Java解法
2015-11-10 13:45:16 来源: 作者: 【 】 浏览:1
Tags:Hanoi 问题 Java 解法

  用什么语言解法都差不多,思路都是一样,递归,这其中只要注重于开始和结果的状态就可以了,对于中间过程,并不需要深究。(我细细思考了一下,还是算了。=_=)


  代码其实很简单注重的是思路。


  问题描述:有一个梵塔,塔内有三个座A、B、C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上。把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。


  简要概括一下,每次只能移动一个盘子,小盘子不能被大盘子压着,源座是A、目标座是C,过渡座是B。


  嗯,问题很明确,下面开始分析。


  我思考的过程是,先考虑一下最简单的情况,即只有一个盘子(n=1),一个盘子很好解决,A——>C即可;当盘子数(n)为不确定的个数的时候,这时候,我们写一个方法,将(n-1)个盘子按规则移动到B盘,那么A盘上剩下的必然是最大的盘子,A——>C直接移动到C盘即可;那么现在B盘上有(n-1)个盘子,为了让这n-1个盘子中的最大的那个盘子移动到C盘,我们写一个方法将(n-2)个盘子按规则移动到A盘,而B座上剩下(n-1)中最大的盘子,将这个盘子移动到C盘;此时A上面有(n-2)个盘子,我们写一个方法将(n-3)个盘子移动到C盘...


  那么现在解法很明了了,后面不过是重复上诉步骤而已了,函数体没变,只是目标座和过渡座变化了而已。


  没有必要去深究这中间的过程,如果从一开始去深究,n个盘子,每一个盘子的轨迹的话,那么只能是越陷越深,有时候也是要换一个角度去考虑问题。


  废话不说了,直接上代码:



public class hanoi {


?


? ? public static void main(String[] args){


? ? ? ? hanoi h = new hanoi();


? ? ? ? h.move(3, 'A', 'B', 'C');


? ? }


? ?


? ? public void move(int n,char a,char b,char c){


? ? ? ? if(n == 1){


? ? ? ? ? ? System.out.println("Disk "+n+" From "+a+" To "+c);


? ? ? ? }else{


? ? ? ? ? ? move(n - 1,a,c,b);


? ? ? ? ? ? System.out.println("Disk "+(n-1)+" From "+a+" To "+c);


? ? ? ? ? ? move(n - 1,b,a,c);


? ? ? ? }


? ? }


}


嗯,以上。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇归并排序的Java实现 下一篇Java程序设计之循环链表

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: