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