问题描述:古代有一个梵塔,塔内有3个座,A、B、C,开始时A座有64个盘,盘子大小不等,大的在上,小的在下。有一个老和尚想把这64个盘子从A座移到C座(如图所示),但每次只允许移动一个盘,且在移动过程中在3个座上始终保持大盘在下,小盘在上。在移动地程中可以行用B座,要求编程序打印出移动的步骤。
逆向推理:1.假如一个和尚能把上面63个盘子先搬到B座,第二个和尚再把最大的那个移到C,第三个和尚再把63个盘子移到C座;至此整个工作就完成的。
2.问题是怎么才能把63个盘子移到B座,按照同样的方法,先把62个盘子选移到C座
,再把第63个盘子移到B座,最后再将62个盘子移到B座。
3……如此类推;
4.从上面分析可以看出:只有等后面那个和尚搬完盘子,前面的和尚才能够去完成任。让我们来栈的数据结构:数据的处理只在一端处理,且是先进后出。所以用递归的方法去处理是正确的。
(汉诺塔图)
using
System;
using System.Collections.Generic;
using System.Text;
namespace HanoiProgram
{
class Program
{
static int count = 0 ; // 计数,总共搬动盘子的次数;
static void PrintMove( char x, char y)
{
Console.WriteLine( " {0}-->{1} " ,x,y);
}
static void Hanoi( int n, char one, char two, char three)
{
if (n == 1 )
{
++ count;
PrintMove(one, three);
}
else
{
++ count;
// 借助中间塔把第N个盘上面(n-1)个盘子的搬移到另一个盘;
Hanoi(n - 1 ,one,three,two);
// 打印第N个盘移到目标塔的步骤;
PrintMove(one,three);
// 借助中间塔把原来第N个盘子上面的(n-1)个盘子搬到现在第N个盘子所在的塔上;
Hanoi(n - 1 ,two,one,three);
}
}
static void Main( string [] args)
{
Console.WriteLine( " 开始搬64个盘子.. " );
Hanoi( 4 , ' A ' , ' B ' , ' C ' );
Console.WriteLine( " 搬迁结速;一共进行了{0}次的搬迁。 " ,count);
Console.Read();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace HanoiProgram
{
class Program
{
static int count = 0 ; // 计数,总共搬动盘子的次数;
static void PrintMove( char x, char y)
{
Console.WriteLine( " {0}-->{1} " ,x,y);
}
static void Hanoi( int n, char one, char two, char three)
{
if (n == 1 )
{
++ count;
PrintMove(one, three);
}
else
{
++ count;
// 借助中间塔把第N个盘上面(n-1)个盘子的搬移到另一个盘;
Hanoi(n - 1 ,one,three,two);
// 打印第N个盘移到目标塔的步骤;
PrintMove(one,three);
// 借助中间塔把原来第N个盘子上面的(n-1)个盘子搬到现在第N个盘子所在的塔上;
Hanoi(n - 1 ,two,one,three);
}
}
static void Main( string [] args)
{
Console.WriteLine( " 开始搬64个盘子.. " );
Hanoi( 4 , ' A ' , ' B ' , ' C ' );
Console.WriteLine( " 搬迁结速;一共进行了{0}次的搬迁。 " ,count);
Console.Read();
}
}
}