#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]; //用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++);即可*/
}