汉诺塔问题(Hanoi)的C++代码实现

 1 #include <iostream>
 2 using namespace std;
 3             //第一个塔为初始塔,第二个塔为中转塔,第三个塔为目标塔
 4 
 5 int i = 1;    //记录步数
 6 void move(int n,char from,char to)                                    //将编号为N的盘子由from塔转移到to塔 
 7 {
 8     cout<<""<<i++<<"步:将"<<n<<"号盘子"<<from<<"---->"<<to<<endl; //输出实例:第1步:将1号盘子A---->C
 9 } 
10 
11 void hanoi(int n,char from,char denpend_on,char to)                    //汉诺塔递归函数,参数依次为盘子数,起始塔,中转塔,目标塔 
12 {
13     if(n==1)
14     {
15         move(1,from,to);                //当需要移动的盘子数为1的时候,将此盘子从起始塔直接移动到目标塔 
16     }
17     else
18     {
19         hanoi(n-1,from,to,denpend_on);    //当需要移动的盘子数不为1的时候,
20                                         //先将除最下面的盘子外的盘子从起始塔借助目标塔移动到中转塔 
21         move(n,from,to);                //将剩下的最后的塔直接从起始塔移动到目标塔 
22         hanoi(n-1,denpend_on,from,to);    //将之前移走的n-1个盘子从中转塔借助起始塔移动至目标塔 
23     }
24 }
25 
26 int main()
27 {
28     int n = 0;//n为盘子数 
29     cout<<"请输入盘子的个数:";
30     cin>>n;
31     while(n<=0)//非法盘子数判断 
32     {
33         cout<<"盘子的个数不应小于1,请重新输入:";
34         cin>>n; 
35     }
36     if(n>0)
37     {
38         char x='A',y='B',z='C';  
39         cout<<"盘子移动情况如下:"<<endl;  
40         hanoi(n,x,y,z); //调用hanoi函数 
41         return 0;
42     } 
43 } 

运行结果:

递归实现,未对过程进行存储。

未用堆栈进行盘子位置的存储,仅展示结果。

理解递归为主吧,就像包子馅的包子(极限是馒头)。

 

侵删。

原C代码出处:http://blog.csdn.net/kkkkkxiaofei/article/details/8333644/

 

posted @ 2017-08-05 20:38  活好  阅读(2492)  评论(1编辑  收藏  举报