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)+" From "+a+" To "+c);
			move(n - 1,b,a,c);
		}
	}
}

   嗯,以上。

posted @ 2015-10-22 20:53  朱向西  阅读(1813)  评论(5编辑  收藏  举报