递归之汉诺塔问题

来源:互联网 发布:网络综艺节目收视率 编辑:程序博客网 时间:2024/05/17 00:08

汉诺塔问题的圆盘的最大数量为64,

#include <stdio.h>#include <stdlib.h>#define N 10int a[N][3]={0};//全局数组,因为每个函数都要用这个数组void show(int a[N][3]);//显示的作用void hanno(int n,char A,char B,char C);//移动的过程就是模型modelvoid move(char X,char Y);//算法和图形化的链接,汉诺塔每一个移动都传输到数据中,再显示出来。这里的数据就是a数组。这里就是将hanno和show链接起来了。这里就是controlvoid show(int a[N][3])//显示{    printf("%5c%5c%5c\n",'A','B','C');    printf("---------------------------\n");    for (int i=0;i<N;i++)    {        for (int j=0;j<3;j++)        {            printf("%5d",a[i][j]);        }        printf("\n");      }}void hanno(int n,char A,char B,char C)//模型{    if(n<1)    {        return;        }     else if(n==1)    {        printf("\n%c->%c",A,C);        move(A,C);//相当于control        show(a);//相当于view        }else    {        hanno(n-1,A,C,B);        printf("\n%c->%c",A,C);        move(A,C);        show(a);        hanno(n-1,B,A,C);}}void move(char X,char Y)//control{    int m=X-65;    int n=Y-65;    int imove=-1;    for (int i=0;i<N;i++)    {        if(a[i][m]!=0)        {            imove=i;            break;             }     }     int jmove;     if(a[N-1][n]==0)     {        jmove=N-1;         }     else     {        jmove=N;        for(int i=0;i<N;i++)        {               if(a[i][n]!=0)            {                   jmove=i;                break;                }             }         jmove-=1;          }      int temp=a[imove][m];      a[imove][m]=a[jmove][n];      a[jmove][n]=temp;}int  main(){    int n=0;    scanf("%d",&n);    for (int i=0;i<n;i++)    {        a[N-1-i][0]=n-i;    }    show(a);    hanno(n,'A','B','C');    return 0;}

运行结果:
输入为4,则结果为

A B C

0    0    00    0    00    0    00    0    00    0    00    0    01    0    02    0    03    0    04    0    0

A->B A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    02    0    03    0    04    1    0

A->C A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    03    0    04    1    2

B->C A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    03    0    14    0    2

A->B A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    14    3    2

C->A A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    01    0    04    3    2

C->B A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    01    2    04    3    0

A->B A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    1    00    2    04    3    0

A->C A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    1    00    2    00    3    4

B->C A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    00    2    10    3    4

B->A A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    12    3    4

C->A A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    01    0    02    3    4

B->C A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    01    0    32    0    4

A->B A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    32    1    4

A->C A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    00    0    20    0    30    1    4

B->C A B C

0    0    00    0    00    0    00    0    00    0    00    0    00    0    10    0    20    0    30    0    4

由上图可知,1,2,3,4代表大盘小盘,也就是盘子的大小。A,B,C代表三个柱子。编程过程中要注意算法和图形化的链接。对于地图等的设计也是一样的,都是先用一种数据结构比如数组等将数据存储器起来,然后再show出来。
汉诺塔问题是一个树状的递归。递归分为树状递归和线性递归。
MVC的设计模式,也就是model,view以及control。

0 0
原创粉丝点击