汉诺塔演示–c语言解释版

付费节点推荐


免费节点


节点使用教程


以下是代码:
[cc lang="c"]
#include
#include
#include
#include
/*------------------------函数申明-------------------------*/
void move(char a,char b,int c); //移动函数
void outputt(char a,char b,int c); //输出函数
/*-----------------------定义全局变量-----------------------*/
/*三个数组中所放每个数据代表每个塔层,数据大小代表塔层大小(即长度)*/
int x[9],y[9],z[9],count=0;
int main()
{
int i;
char s[99]; //用s接受塔层数,然后赋值给n,这样容许一些错误输入
int n;
system("color 0A");
do
{
system("cls");
printf("此为汉诺塔演示程序\n请输入汉诺塔阶数(1-9):\n");
scanf("%s",s);
}while(strlen(s)!=1||s[0]<49||s[0]>57);
n=s[0]-48;
for(i=0;i<=n-1;i++) //初始化三个数组 x[n-1-i]=2*i+1; for(i=n;i<9;i++) x[i]=0; for(i=0;i<9;i++) y[i]=0; for(i=0;i<9;i++) z[i]=0; outputt('a','b',1); /*输出,其中的传递 ('a','b',1)没有意义 只为cfree的特殊编译需要*/ getchar(); move('x','z',n); return 0; } /*--------移动函数,将a代表的塔的上面c层移到b代表的塔上-----*/ void move(char a,char b,int c) { int i,xtop,ytop,ztop; if(c==1) // 只移动一层 { for(i=0;i<9;i++) if(x[i]==0) break; xtop=i-1; for(i=0;i<9;i++) if(y[i]==0) break; ytop=i-1; for(i=0;i<9;i++) if(z[i]==0) break; ztop=i-1; if(a=='x'&&b=='y') { y[ytop+1]=x[xtop]; x[xtop]=0; } else if(a=='x'&&b=='z') { z[ztop+1]=x[xtop]; x[xtop]=0; } else if(a=='y'&&b=='x') { x[xtop+1]=y[ytop]; y[ytop]=0; } else if(a=='y'&&b=='z') { z[ztop+1]=y[ytop]; y[ytop]=0; } else if(a=='z'&&b=='x') { x[xtop+1]=z[ztop]; z[ztop]=0; } else { y[ytop+1]=z[ztop]; z[ztop]=0; } count++; outputt('a','b',1); } else // 移动多层 { if(a!='x'&&b!='x') { move(a,'x',c-1); move(a,b,1); move('x',b,c-1); } else if(a!='y'&&b!='y') { move(a,'y',c-1); move(a,b,1); move('y',b,c-1); } else { move(a,'z',c-1); move(a,b,1); move('z',b,c-1); } } } /*------------------------输出函数-------------------------*/ /*------------每次都是清屏再逐行输出,纯数字计算------------------------*/ void outputt(char a,char b,int c) { int i,j; int p1[9],p2[9],p3[9],p4[9],p5[9],p6[9],p7[9]; for(i=0;i<9;i++) p1[i]=x[i]-(!x[i]); for(i=0;i<9;i++) p1[i]=8-(p1[i]-1)/2; for(i=0;i<9;i++) p2[i]=x[i]; for(i=0;i<9;i++) p3[i]=y[i]-(!y[i]); for(i=0;i<9;i++) p3[i]=25-(p3[i]-1)/2-p1[i]-p2[i]; for(i=0;i<9;i++) p4[i]=y[i]; for(i=0;i<9;i++) p5[i]=z[i]-(!z[i]); for(i=0;i<9;i++) p5[i]=42-(p5[i]-1)/2-p1[i]-p2[i]-p3[i]-p4[i]; for(i=0;i<9;i++) p6[i]=z[i]; for(i=0;i<9;i++) p7[i]=51-p1[i]-p2[i]-p3[i]-p4[i]-p5[i]-p6[i]; system("cls"); printf("===================此为汉诺塔演示程序===================\n"); printf("=========================第%d步",count); if(count<10) printf("==========================\n"); else if(count>=10&&count<100) printf("=========================\n"); else printf("========================\n"); printf("\n\n\n\n\n"); for(i=8;i>=0;i--)
{
for(j=1;j<=5;j++) printf(" "); for(j=1;j<=p1[i];j++) printf(" "); for(j=1;j<=p2[i];j++) printf("%c",22); for(j=1;j<=p3[i];j++) printf(" "); for(j=1;j<=p4[i];j++) printf("%c",22); for(j=1;j<=p5[i];j++) printf(" "); for(j=1;j<=p6[i];j++) printf("%c",22); for(j=1;j<=p7[i];j++) printf(" "); printf("\n"); } printf("\n\n按回车键继续..."); getchar(); /*-----若为自动演示,可将前面两句改为for(i=0;i<2e8;i++);即可*/ } [/cc]

未经允许不得转载:Bcoder资源网 » 汉诺塔演示–c语言解释版

相关推荐

赞 (1)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册