汉诺塔问题的圆盘的最大数量为64,
#include <stdio.h>
#include <stdlib.h>
#define N 10
int a[N][3]={0};//全局数组,因为每个函数都要用这个数组
void show(int a[N][3]);//显示的作用
void hanno(int n,char A,char B,char C);//移动的过程就是模型model
void move(char X,char Y);//算法和图形化的链接,汉诺塔每一个移动都传输到数据中,再显示出来。这里的数据就是a数组。这里就是将hanno和show链接起来了。这里就是control
void 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 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
1 0 0
2 0 0
3 0 0
4 0 0
A->B A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
2 0 0
3 0 0
4 1 0
A->C A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
3 0 0
4 1 2
B->C A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
3 0 1
4 0 2
A->B A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 1
4 3 2
C->A A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
1 0 0
4 3 2
C->B A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
1 2 0
4 3 0
A->B A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 1 0
0 2 0
4 3 0
A->C A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 1 0
0 2 0
0 3 4
B->C A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 2 1
0 3 4
B->A A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 1
2 3 4
C->A A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
1 0 0
2 3 4
B->C A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
1 0 3
2 0 4
A->B A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 3
2 1 4
A->C A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 2
0 0 3
0 1 4
B->C A B C
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 1
0 0 2
0 0 3
0 0 4
由上图可知,1,2,3,4代表大盘小盘,也就是盘子的大小。A,B,C代表三个柱子。编程过程中要注意算法和图形化的链接。对于地图等的设计也是一样的,都是先用一种数据结构比如数组等将数据存储器起来,然后再show出来。
汉诺塔问题是一个树状的递归。递归分为树状递归和线性递归。
MVC的设计模式,也就是model,view以及control。