读书人

汉诺塔程序//为何正确?解决办法

发布时间: 2012-04-14 17:14:21 作者: rapoo

汉诺塔程序//为何正确?
#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 

读书人网 >C语言

热点推荐