解决汉诺塔问题

汉诺塔是个古老的游戏。游戏规则如下:有ABC 三个柱子 A上从下向上摆好了从大到小的n个盘子,BC均为空柱子,现要将A上的盘子移动到C上,每次只能移动一个盘子,大的盘子只能在小的盘子下面。问具体最短移动步骤。

首先明确问题:具体步骤和移动步数,如果只解决步数想必应该比具体步骤容易些。

问题分析:此问题应该使用抽象的数学形式来解决。首先,我们将A盘上的n个盘子分为两部分,第n个盘子和(n-1)个盘子假设有一个移动方法能够将n-1个盘子移动到B上,那么剩下的第n个盘子移动到C,现在剩下的解决方案应该是一样的,把n-1个盘子分为(n-2)个盘子和第n-1盘子两个部分,抽象的方法又移动第n-2个盘子到A上,B上剩下的n-1个盘子又能直接移动到C上。重复以上步骤,最终能将n个盘子全部移动到C上。

现在我们就要把数学模型抽象出来,既然我们只能移动一个盘子,而且最大的只能在小的下面,那么我们每次移动都将小每个柱子上的盘子分为两部分:最大的和剩余的(将剩余的看作小的),先将小的移走,那么最大的就能直接移动到目标柱子,再将小的移动到目标柱子上,任务完成。那么移动的方法就是抽象的方法(递归)。

使用C#递归解决该问题::

	class HanoiSolution  
	{     
		static void Main(string[] args)  
		{  
			char A='A',B='B',C='C';  
			int n=5;//移动总的个数  
			Hanoi(A,B,C,n);  
			Console.ReadKey();  
		}  
		/// <summary>递归汉诺塔方法  
		/// </summary>  
		/// <param name="from">移动的柱子</param>  
		/// <param name="from">目标的柱子</param>  
		/// <param name="from">借助的柱子</param>  
		/// <param name="from">移动的个数</param>  
		/// <returns></returns> 	
		static void Hanoi(char from,char to,char other,int n)  
		{  
			if(n==1) //如果一个盘子就移动一次到目标柱子  
			{  
				Console.WriteLine("{0}-->{1}",from,to);  
			}
			else if(n>1) //如果个数大于1个继续递归
			{
				Hanoi(from,other,to,n-1); //把from上的n-1个盘子移动到other上  
				Hanoi(from,to,other,1); //把from上的第n个盘子移动到to上  
				Hanoi(other,to,from,n-1); //把other上的n-1个盘子移动到to上  
			}
		}
	}


问题得到解决。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值