- ·上一篇文章:c语言三维球动画程序
- ·下一篇文章:12个有趣的C语言面试题及答案
汉诺塔演示–c语言解释版
-->
以下是代码:
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语言解释版