汉诺塔程序//为何正确?
#include<stdio.h>
/*
可以定义一个函数movedisc(n,a,b,c)。该函数的功能是:将N个盘子从A杆上借助C杆移动到B杆上。这样移动N个盘子的工作就可以按照以下过程进行:
1) movedisc(n-1,a,c,b);
2) 将一个盘子从a移动到b上;
3) movedisc(n-1,c,b,a);
*/
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle);
int i=0;
int main()
{
unsigned n;
printf("please enter the number of disc:");
scanf("%d",&n); /*输入N值*/
printf("\tneedle:\ta\t b\t c\n");
movedisc(n,'a','c','b'); /*从A上借助B将N个盘子移动到C上*/
printf("\t Total: %d\n",i);
}
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle)
{
if(n>0)
{
movedisc(n-1,fromneedle,usingneedle,toneedle);
/*从fromneedle上借助toneedle将N-1个盘子移动到usingneedle上*/
++i;
switch(fromneedle) /*将fromneedle 上的一个盘子移到toneedle上*/
{
case 'a': switch(toneedle)
{
case 'b': printf("\t[%d]:\t%2d………>%2d\n",i,n,n);
break;
case 'c': printf("\t[%d]:\t%2d…………..…>%2d\n",i,n,n);
break;
}
break;
case 'b': switch(toneedle)
{
case 'a': printf("\t[%d]:\t%2d<….%2d\n",i,n,n);
break;
case 'c': printf("\t[%d]:\t %2d……..>%2d\n",i,n,n);
break;
}
break;
case 'c': switch(toneedle)
{
case 'a': printf("\t[%d]:\t%2d<……….…%2d\n",i,n,n);
break;
case 'b': printf("\t[%d]:\t %2d<……..%2d\n",i,n,n);
break;
}
break;
}
movedisc(n-1,usingneedle,toneedle,fromneedle);
/*从usingneedle上借助fromneedle将N-1个盘子移动到toneedle上*/
}
}
[解决办法]
- C/C++ code
01./*----------------------------------------- 02.-------------用栈来实现Hanoi--------------- 03.---------writer:neolyao 2012-1-21---------- 04.-------------------------------------------*/ 05. 06.#include<stdio.h> 07.#define MAX 100 08.typedef struct DATA 09.{ 10. 11. char x; 12. char y; 13. char z; 14. int flag; //flag==1,表示还可以分解,若为0这不能分解 15. int num; //表示盘子个数 16.}DATATYPE; 17. 18.void Hanoi(int n,char x,char y,char z); 19.int main() 20.{ 21. 22. int n; 23. printf("请输入盘子的个数:"); 24. scanf("%d",&n); 25. Hanoi(n,'X','Y','Z'); 26. return 0; 27. 28. 29.} 30. 31. 32.void Hanoi(int n,char x,char y,char z) 33.{ 34. DATATYPE stack[MAX]; 35. int x1,y1,z1,m,top=1; 36. 37. stack[top].num=n; 38. stack[top].flag=1; 39. stack[top].x=x; 40. stack[top].y=y; 41. stack[top].z=z; 42. while(top) 43. { 44. if(stack[top].flag==1&&stack[top].num>1) 45. { 46. m=stack[top].num; //参数的传递==Hanoi(num,x,y,z); 47. x1=stack[top].x; 48. y1=stack[top].y; 49. z1=stack[top].z; 50. 51. stack[top].num=m-1; //将第m-1个盘子经过x从y移到z==Hanoi(m-1,y,x,z) 52. stack[top].flag=1; 53. stack[top].x=y1; 54. stack[top].y=x1; 55. stack[top].z=z1; 56. 57. top++; 58. 59. stack[top].num=m; 60. stack[top].flag=0; //将第m个盘子从x移到z==Move(m,x,z) 61. stack[top].x=x1; 62. stack[top].y=z1; 63. 64. 65. top++; 66. stack[top].num=m-1; 67. stack[top].flag=1; 68. stack[top].x=x1; //将第m-1个盘子从x经过z移到y==Hanoi(m-1,x,z,y) 69. stack[top].y=z1; 70. stack[top].z=y1; 71. } 72. 73. while(top>0&&(stack[top].flag==0||stack[top].num==1)) 74. { 75. 76. if(top>0&&stack[top].flag==0) //将第n个盘子从x移到z 77. { 78. printf("将第%d个圆盘从塔%c移动到%c\n",stack[top].num,stack[top].x,stack[top].y); 79. top--; 80. } 81. if(top>0&&stack[top].num==1) //将第一个盘子从x移到z 82. { 83. printf("将第%d个圆盘从塔%c移动到%c\n",stack[top].num,stack[top].x,stack[top].z); 84. top--; 85. } 86. } 87. } 88.} 89. 90. 91. 92.//请输入盘子的个数:3 93.//将第1个圆盘从塔X移动到Z 94.//将第2个圆盘从塔X移动到Y 95.//将第1个圆盘从塔Z移动到Y 96.//将第3个圆盘从塔X移动到Z 97.//将第1个圆盘从塔Y移动到X 98.//将第2个圆盘从塔Y移动到Z 99.//将第1个圆盘从塔X移动到Z 100.//Press any key to continue