c语言汉罗塔问题使用栈的原理,汉诺塔问题,自己写的算法,没看过教材,用数组栈模拟柱子,包含整...

本文详细介绍了汉诺塔问题的解决方法,利用递归策略演示了如何将九层塔从A柱移动到B柱,通过C柱作为中转,同时记录了每次移动的步骤和总次数。适合初学者理解递归算法在实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

/* 汉诺塔问题,算法思想:从根部考虑,如果要整个从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下运行成功�

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值