该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
/* 汉诺塔问题,算法思想:从根部考虑,如果要整个从A移到B,则需先把
A移N-1块到C,再把底块移到B,再把N-1块移回B
*/
#include "Stdio.h"
#include "Conio.h"
#define N 9
int a[N]={10,9,8,7,6,5,4,3,2,1},c[N],b[N]; /*定义三个柱子,并初始化a柱,高位为顶,较小*/
int *top_a,*top_b,*top_c; /*定义三个柱顶指针*/
*top_a=a+9;
*top_b=b-1;
*top_c=c-1; /*指针初始指向柱顶,类似于栈,b和c一开始没有元素,指向柱地下室负一楼*/
long times=0; /*统计移动次数,注意N太大时,会发生溢出*/
int signal_move(int p[],int q[]) /*定义单个移动,并输出移法,移动方出栈,移向方进栈*/
{
times++;
if(p==a&&q==b)
{*(top_b+1)=*top_a;*top_a=0;top_b++;top_a--;printf("The %d step: from a to b\n",times);} /* 从a移到b */
else if(p==a&&q==c)
{*(top_c+1)=*top_a;*top_a=0;top_c++;top_a--;printf("The %d step: from a to c\n",times);} /* 从a移到c */
else if(p==b&&q==a)
{*(top_a+1)=*top_b;*top_b=0;top_a++;top_b--;printf("The %d step: from b to a\n",times);} /* 从b移到a */
else if(p==b&&q==c)
{*(top_c+1)=*top_b;*top_b=0;top_c++;top_b--;printf("The %d step: from b to c\n",times);} /* 从b移到a */
else if(p==c&&q==a)
{*(top_a+1)=*top_c;*top_c=0;top_a++;top_c--;printf("The %d step: from c to a\n",times);} /* 从c移到a */
else if(p==c&&q==b)
{*(top_b+1)=*top_c;*top_c=0;top_b++;top_c--;printf("The %d step: from c to b\n",times);} /* 从c移到b */ /*每移一个单个,次数加一*/
}
void move(int x[],int y[],int z[],int i) /*定义从x移动x的i层到y,经过z中转*/
{
if(i==1)
{
signal_move(x,y); /*如果只移动一层,则直接移动*/
}
else if(i>1) /*如果不只移一层*/
{
move(x,z,y,i-1); /*递归,则先将i-1层移到中转站,通过y中转*/
signal_move(x,y); /*再将底层移到目标站*/
move(z,y,x,i-1); /*递归,再将i-1层移回到目标站,通过x中转*/
}
};
int main(void)
{
/* 此处添加你自己的代码 */
int i;
move(a,b,c,9); /*执行由a到b的移动,通过c中转*/
/*程序到此已经OK了,下面的程序只是简单地输出结果测试*/
for(i=N-1;i>=0;i--)printf("a[%d]is:%d\n",i,a[i]); /*输出运行后的a*/
printf("\n\n");
for(i=N-1;i>=0;i--)printf("b[%d]is:%d\n",i,b[i]); /*输出运行后的b*/
printf("\n\n");
for(i=N-1;i>=0;i--)printf("c[%d]is:%d\n",i,c[i]); /*输出运行后的c*/
printf("The move times is:%d",times);
getch();
}
程序在WIN-TC下运行成功�