汉诺塔演示--c语言
//[local]2[/local]//附件中有相关效果图及exe文件,源代码如下
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
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];
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);
getchar();
move('x','z',n);
return 0;
}
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<3e8;i++);
}
//呵呵,用vc编译即可得到exe执行文件
//QQ:1049822531