当前位置:K88软件开发文章中心编程语言C/C++C/C++01 → 文章内容

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

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-4 7:35:59

-->

以下是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#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++);即可*/
}

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