Hanio 问题

 Hanio 问题

   问题描述

   庙里的和尚,闲得无聊,庙中有三个柱子,分别标记为柱子A,柱子B,柱子C.

   柱子A有三个盘子,这三个盘子呢,直径最大的放在最下面,第二大的放中间,最小的放最上面。

   柱子B是空的。

   柱子C也是空的。

   如果A柱子上的盘子能借助B 搬到C柱子上,并切盘子顺序是跟原先A上一致。做这个过程和尚感觉是非常有意思的。没办法,吃饱了撑的。

   当然这里面有两个规则

  1 第次只能搬一个

   2 不能将大直径的放到小直径上面

  分析问题

   假设A上面有N个盘子,如果我呢把N-1个盘子已经搬到了B上面,我只需要将A盘子放到这个C上面,第N个盘子的直径是最大的,再以后的搬动过程中是不需要动C上第N个盘子的。以上搬动N个盘子的问题,就变为搬N-1个盘子的问题。如此规则执行下去,只后只有一个圆盘的时候,问题直接解决了。

  这种方式适合递归算法

     1 有递归出口,那就是当盘子只有一个时候,问题很简单,直接解决

      2 有策略能使问题规模缩小,并且问题是相似,

        a 将N-1个盘子从A 搬到B柱上面,(借助C)

        b 将A柱子上第N个盘子搬到C柱上面

        c 将B柱子上N-1个盘子搬到C柱子上面 (借助A)

   OK 那java实现为

  

  

	public void hanioAlgorithms(int n,String A,String B,String C){
		if (n==1 )
		{
			  move(1,A,C);
			  return;
		}
		hanioAlgorithms(n-1,A,C,B);
		this.move(n, A, C);
		hanioAlgorithms(n-1, B, A, C);
		
		
		
	}
	private void move(int n ,String A,String C){
		System.out.println("将第"+n+"个盘子 从"+A+"移动到"+C);
	}

}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章