纠结了好久才弄得明白一点点的汉诺塔问题,现在把一些方程与大家分享一下!

来源:互联网 发布:mac mini 装win10 编辑:程序博客网 时间:2024/05/15 21:58

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

谢谢各位的支持!下面是我这两天仔细研究的结果,希望大家看看有什么不对!有的话,请提出你的意见,谢谢了!
这个程序是目的是:将A柱上的金盘移到B柱上

//从A到B

#include < iostream >

using namespace std;

void move(int inum, char from, char to);
void hanoi(int inum, char a, char b, char c);

void main()
{
int inum;

cout << "Please input the number of Gold Disk :" << endl;
cin >> inum;

cout << "当金盘数为"<< inum
<< "时将A上的金盘移动到B上的步骤为:"
<< endl;
hanoi(inum, 'A', 'B', 'C'); // 借助C,将A上的金盘移动到B上
}

void move(int inum, char from, char to)
{
cout << inum <<" :" << from << "移动到" << to << endl;
}

void hanoi(int inum, char a, char b, char c)
{
if (inum == 1) //每一次递归的终止条件
move(inum, a, b); //将第inum个金盘直接移动到B上
else
{
hanoi(inum-1, a, c, b); //将inum-1个金盘借助于B,从A移动到C上
move(inum, a, b); //将第inum个个金盘直接从A移动到B上
hanoi(inum-1, c, b, a); //将第inum-1个金盘借助于A,从C移到B上,就可以完成了目的
} //即从A上的金盘全部移到B上
}

 

 

以下只分析inum = 3的情况:

 

当inum = 3 时:程序其实是:

hanoi(3, A,B,C)
{
   if(为1)
      move(1, A,B);     //将第inum个金盘直接移动到B上
   else
   {
      @1: hanoi(2,A,C,B);  //将inum-1个金盘借助于B,从A移动到C上
      @2: move(2,A,B);     //将第inum个个金盘直接从A移动到B上
      @3: hanoi(2,C,B,A);  //将第inum-1个金盘借助于A,从C移到B上,就可以完成了目的
   }
}

===>>>
@1: 先执行这个
hanoi(2, A,C,B)
{
   if(为1)
      move(1, A,C);   
   else
   {
       hanoi(1,A,B,C); 
       move(2,A,C);    
       hanoi(2,B,C,A); 
   }
}

hanoi(1, A,B,C)
{
   if(为1)
      move(1, A,B);           // 1:A移到B
   else
   {
      
     //这部分不用看了,,在此不修改了!
       
   }
}

 

===================================================================
@2:再执行这个:
move(2,A,C);                 //2:输出A到C

@3:再执行这个:
hanoi(2,B,C,A);        //这里就不一一列出来了,输出结果应该是: 1:B移到C   3:A移动到B

最后就执行move:
        2:C移动到B    1:A移到B       

 

 

 

 

 

大家有什么补充请补充一下,谢谢,互相学习学习!

 

 

 

原创粉丝点击