汉诺塔问题(1)
View Code
//**************************************************
Description
问题的提出:约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆(分别使A、B、C),最左边的杆上自上而下、
由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘
放在小盘的上面。这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘
上面,所以64个盘的移动次数是:18446744073709551615
这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。
Input
测试数据有多组,每组此时数据就包含一个要移动的盘数n,为了使题目简单话,则n<=10。输入0表示结束。
Output
输出每组移动的步骤,并每十步换一行,格式如样例输出。并且每组之间空一行,但最后一组例外。
Sample Input : 3
Sample Output: A-->C A-->B C-->B A-->C B-->A B-->C A-->C
//****************************************************
#include<iostream>
using namespace std;
int k;
int xx;
void move( int n , char x , char y , char z )
{
if( n == 1 )
{
printf( "%c-->%c" , x , z ); //把A座上剩下的一个盘移到C座上;
k++;
if(k%10&&k&&k!=xx) cout<<" ";
if(k%10==0&&k) cout<<endl;
return ;
}
move( n - 1 , x , z , y ); //将A上n-1个盘子借助C座线移到B座上
printf( "%c-->%c" , x , z );
k++;
if(k%10&&k&&k!=xx) cout<<" ";
if(k%10==0&&k) cout<<endl;
move( n - 1 , y , x , z ); //将n-1个盘从B座借助于A座移到C座上
}
int main()
{
int n;
while( cin>>n , n )
{
k=0;
xx=1;
for(int i=1;i<=n;i++)
xx*=2;
xx=xx-1;
move( n , 'A' , 'B' , 'C' );
cout<<endl<<endl;
}
return 0;
}