当前位置:编程学习 > VB >>

用递归与非递归来编写C++汉诺塔程序

要求在一个程序里完成两种方法
答案:搜索一下吧,知道里面很多的!参考资料: http://zhidao.zhaoxi.net/q?word=%BA%BA%C5%B5%CB%FE&ct=17&pn=0&tn=ikaslist&rn=10非递归先必须确定一个移动的方向,比如A->B->C,或者A->C->B,但这个顺序一旦却确定后就不可以再改变了的,否则永远都不会成功。     然后一直按下面两个步骤循环,直到全部完成。         1、把第一片移到下一个位置,比如原来在A,顺序是A->B->C,哪就是移到B,原来在B的就是到C,在C的             就是到A     2、把除第一片以外,可以移动的另外一片移动到可以移动的为止,这个看似模糊,但其实关系是确定的,这个时候只有一片可以移动,而且位置也只有一个可以让它移动。         就是这么两个步骤,用来完成汉诺塔         下面是我的程序         (注:我在程序中作了个弊,如果是奇数片,那顺序一定是A->C->B,(其中A是原柱,B是辅柱,C是目的柱;如果是偶数片,那顺序一定是A->B->C)         #include        //#include        //#include        #include            void   henit(int   n,   char   fromreg,   char   auxreg,   char   toreg)     {       char   heni[255]   =   {0},   tmptoreg;       int   i;           tmptoreg   =   toreg;           if(n%2)       {     int   tmp   =   auxreg;     auxreg   =   toreg;     toreg   =   tmp;       }           for   (i=1;   i<=n;   i++)       {       heni[i]   =   fromreg;       }           while   (1)       {           if   (heni[1]   ==   fromreg)           {           heni[1]   =   auxreg;           printf("\t1:   %c-->%c\n",   fromreg,   auxreg);           }           else           if   (heni[1]   ==   auxreg)           {           heni[1]   =   toreg;           printf("\t1:   %c-->%c\n",   auxreg,   toreg);           }           else           if   (heni[1]   ==   toreg)           {           heni[1]   =   fromreg;           printf("\t1:   %c-->%c\n",   toreg,   fromreg);           }               for   (i   =   1;   heni[i]   ==   tmptoreg   &&   i<=n;   i++)           ;           if(i>n)           break;         for(i=1;i<=n;i++)     if(heni[i]   ==   fromreg)   break;     if(i>n)     {     heni[n+1]=fromreg;     goto   Next;     }     for(i=1;   i<=n;   i++)     if(heni[i]   ==   auxreg)   break;     if(i>n)     {     heni[n+1]=auxreg;     goto   Next;     }     for(i=1;   i<=n;   i++)     if(heni[i]   ==   toreg)   break;     if(i>n)     {     heni[n+1]=toreg;     goto   Next;     }         Next:           for(i=2;   heni[i]   ==   heni[1]   &&   i<=n   ;   i++)     ;           for(int   j=i+1;   j<=n+1;   j++)           {           if   ((heni[j]   !=   heni[1])   &&   (heni[j]   !=   heni[i])   &&   (i<=n))           {     printf("\t%d:   %c-->%c\n",   i,   heni[i],   heni[j]);     heni[i]   =   heni[j];     break;           }           }       }     }         int   main(void)     {     int   n   =   0;     //time_t   start_t,   end_t;     struct   time   start_t,   end_t;         //clrscr();     printf("Input   your   number:");     scanf("%d",   &n);     //start_t   =   time(NULL);     gettime(&start_t);     henit(n,   'A',   'B',   'C');     //end_t   =   time(NULL);     gettime(&end_t);     //printf("Ok,it   is   down   now!   use   %d   seconds",   int(end_t   -   start_t));             printf("Ok,it   is   down   now!   use   %2d:%02d:%02d.%02d",   \                             (end_t.ti_hour-start_t.ti_hour),   (end_t.ti_min-start_t.ti_min),   \                             (end_t.ti_sec-start_t.ti_sec),   (end_t.ti_hund-start_t.ti_hund));     getchar();     getchar();     return   0;     }
#include <stdio.h>
#include <stdlib.h>

void Hanoi(int k, char A, char B, char C)
{
if(k > 0)
{
Hanoi(k - 1, A, C, B);
printf("%d : %c -> %c\n", k, A, C);
Hanoi(k - 1, B, A, C);
}
}

int main()
{
//从'A' 移动到 'C'
Hanoi(5, 'A', 'B', 'C');
system("PAUSE");
return 0;
}

非递归的应该用栈,代码比较多。原理是将三个柱看成是一个循环
A -> B -> C -> A 以此类推
若是奇数次移动将最小的移到下一个位置,偶数次移动最小的不懂,
将另外两个柱子中较小的移动到令一个
procedure Hanoi(N,A,B,C:integer;);{以B柱为中转柱将N个盘子从A柱移动到C柱}
begin
if N=1 then write(A,’->’,C){把盘子直接从A移动到C}
else begin
Hanoi(N-1,A,C,B);{ 以C柱为中转柱将N-1个盘子从A柱移动到B柱}
write(A,’->’,C);{把剩下的一个盘子从A移动到C}
Hanoi(N-1,B,A,C); { 以A柱为中转柱将N-1个盘子从B柱移动到C柱}
end;
end;
这里有你想要详细资料 http://zhidao.zhaoxi.net/q?word=%BA%BA%C5%B5%CB%FE&ct=17&pn=0&tn=ikaslist&rn=10可以看下这个页面,有比较详细的介绍 http://hi.zhaoxi.net/271032830/blog/item/ff3bed0f2ccd152e6059f3d6.html

上一个:vb高手进?
下一个:VB解释代码

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,