汉诺塔问题(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;
}
posted @ 2011-04-13 15:06  聊聊IT那些事  阅读(493)  评论(0编辑  收藏  举报