汉诺塔问题(1)
2016-01-15 00:00
351 查看
![](http://static.oschina.net/uploads/img/201601/15103900_dD0N.gif)
![](http://static.oschina.net/uploads/img/201601/15103900_HoNU.gif)
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; }
相关文章推荐
- hdu1287
- hdu(2203)
- poj(1458)(最长公共子序列)
- dp之路
- foj2013
- linux端口开放
- zoj3501
- 结构体——小结
- java swing Jtable&log4j
- poj3641(学习了)
- 雅可比迭代法和高斯赛德尔迭代法
- 双向链表内结点的删除(4)
- 数组和链表的区别
- Android手机文件管理
- nginx安装
- JDBC:JabaBean对数据库的操作----增删改查
- 如何在PDF Transformer+中将PDF转换成Excel
- OC学习日总结
- Objective-c学习日总结之与C的区别及类与对象的定义,类的声明及调用方法
- Math.min与Math.min.apply(null,arguments)区别