C语言汉诺塔程序

C语言汉诺塔程序,第1张

将以下内容全部复制到新建的源文件中:(本人自己写的,因为你那课本上的代码,没解释,书写不规范,很难理解清楚,所以我直接新写了一个完整的代码,附带详细说明)

#include <stdio.h>

//汉诺塔x层塔从A塔整体搬到C塔,中间临时B塔。

//x层塔是从大到小往上叠放。每次移动只能移动一层塔。并且在移动过程中必须保证小层在上边

//借助B塔可以将x层塔全部从A搬到C上,并且符合要求(在移动过程中大的那块在下边,小的那块在上边)

int main()

{

void tower(int x,char a,char b,char c) //声明函数

int x=5,a='A',b='B',c='C' //x表示有5层塔,具体要多少层自己修改这个值。abc分别表示ABC塔。

tower(x,a,b,c) //x层塔从a移动到c的全过程,主程序只有这条有效语句

return 0

}

//以下是tower函数的定义

//参数解析:x层塔放在a上,b是中间塔,c是目标塔。即x层塔要从a搬到c上。

//此函数实现x层塔从a整体转移到c上。以及这个过程是怎么搬的全部过程。

void tower(int x,char a,char b,char c)

{

if(x==1)printf("将%d从%c放到%c\n",x,a,c) //只有1层塔时,直接从a搬到c上。

else //不止1层塔,则先将x-1层塔从a按照规律搬到b上,再将最后一块从a搬到c上,最后再将b上的x-1层塔按照规律搬到c上。

{

tower(x-1,a,c,b) //先将x-1层塔从a按照规律搬到b上,注意参数b放在最后,因为放在最后的参数是准备搬过去的目标塔。

printf("将%d从%c放到%c\n",x,a,c) //将最后一块从a搬到c上

tower(x-1,b,a,c) //最后再将b上的x-1层塔按照规律搬到c上,注意参数b放在开头,因为x-1层是要从b上搬过去的。

}

}

hanoi(n,a,b,c)

int n

char a,b,c

{if (n==1) printf("%c-->%c\n",a,c)

else {hanoi (n-1,a,c,b)

printf ("%c-->%c\n",a,c)

hanoi (n-1,b,a,c)}

}

我给你详细解释下这个程序中的代码吧。我也是刚学,希望对你有用。可能有些不好之处,还希望谅解。

先说下这个问题的整体思想:

1,如果只有1个盘,那么就直接把这个盘从A移动到C上。

2,如果存在两个盘,那么先把第一个盘移动到B上,在把最下面一个盘移动到C上,在把B上的盘移动到C上。

3,这样,我们可以得出一个结论,如果存在N个盘,可以先把上面N-1个盘通过C 移动到B上,然后把第N个盘移动到C上, 再把B上的N个盘通过A移动到C上。

if (n==1) printf("%c-->%c\n",a,c)

这一句,表示只有1个盘子的时候,那么就是把第一个盘子直接移到第三个盘子上。

else {hanoi (n-1,a,c,b)

如果超过一个盘字,则需要先把N-1个盘子通过C 移动到B上。

printf ("%c-->%c\n",a,c)

把剩下的第N个盘,从A移动到C上。

hanoi (n-1,b,a,c)}

再把剩下的在B上的N-1个盘,通过A移动到C上。

这属于一个递归算法。

现在,N=3。

我们看下程序怎么运行的。

else {hanoi (n-1,a,c,b)

printf ("%c-->%c\n",a,c)

hanoi (n-1,b,a,c)}

N=3,也就是开始程序会执行

hanoi (2,a,c,b)这句语句。

再看,2还是大于1,所以

程序会继续运行。 注意,这里,为hanoi (2,a,c,b)C和B 换了位置。

hanoi (2,a,c,b)

我们把数字代入,得出。

根据 N=2,C和B 互换。以及下面的代码,得出

````````````````````````````````````````````````

hanoi(n,a,b,c)

int n

char a,b,c

{if (n==1) printf("%c-->%c\n",a,c)

else {hanoi (n-1,a,c,b)

printf ("%c-->%c\n",a,c)

hanoi (n-1,b,a,c)}

}

```````````````````````````````````````````````

hanoi(2,a,c,b)

int n=2

char a,c,b

{if (n==1) printf("%c-->%c\n",a,b)

else {hanoi (1,a,b,c)

printf ("%c-->%c\n",a,b)

hanoi (1,c,a,b)}

} / 这并不是正确的代码,只是为了得出答案而写的一些数据。/

这样, 我们可以看出,程序会先执行

else {hanoi (1,a,b,c)

所以,开始会先输出A C(中间的符号省略,以下也一样)

然后,再输出

printf ("%c-->%c\n",a,b)A B

接着,执行

hanoi (1,c,a,b)} 这时候,就是C B了。

也就是说 hanoi(2,a,c,b) 的输出为 AC AB CB

你的问题就已经解决了。

接下来再返回第一层:

现在,N=3。

我们看下程序怎么运行的。

else {hanoi (n-1,a,c,b)

printf ("%c-->%c\n",a,c)

hanoi (n-1,b,a,c)}

这时候,我们再把数字代进去。

现在,N=3。

我们看下程序怎么运行的。

else {hanoi (2,a,c,b)

printf ("%c-->%c\n",a,c)

hanoi (2,b,a,c)}

根据上面的结论

/ 也就是说 hanoi(2,a,c,b) 的输出为 AC AB CB /

可以看出,先执行第一条语句:

else {hanoi (2,a,c,b)

则输出 AC AB CB

再执行第二条语句:

printf ("%c-->%c\n",a,c)

输出 AC

然后执行第三条

hanoi (2,b,a,c)}

根据这里,/ 也就是说 hanoi(2,a,c,b) 的输出为 AC AB CB /

字母进行替代后,A变B,C变A B变C。

所以输出的AC AB CB 则为

BA BC AC

所以,最终的结果为 AC AB CB AC BA BC AC

中间可能有很多废话,可以不看。

这样算下去,不管多少层都能推算出来,可复杂度会高得难以想像。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11127398.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存