解决汉诺塔问题

汉诺塔是个古老的游戏。游戏规则如下:有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上  
			}
		}
	}

问题得到解决。

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/PermCoder/article/details/78556323
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞