C语言汉诺塔程序

voidmove(charx,chary){printf("%c--->%c\n",x,y);}voidhanoi(intn,charone,chartwo,charth... void move( char x, char y )

{
printf( "%c ---> %c\n", x, y );
}

void hanoi( int n, char one, char two, char three )

{
if ( n == 1 ) move( one , three )

else

{
hanoi( n - 1, one , three, two );

move( one, three );

hanoi( n - 1, two, one, three );
}
}
别复制粘贴啊,我实在不明白,他每一步的过程能详细讲讲吗
展开
 我来答
券商论
2020-01-30 · TA获得超过4280个赞
知道小有建树答主
回答量:968
采纳率:76%
帮助的人:203万
展开全部
将以下内容全部复制到新建的源文件中:(本人自己写的,因为你那课本上的代码,没解释,书写不规范,很难理解清楚,所以我直接新写了一个完整的代码,附带详细说明)
#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上搬过去的。
}
}
松思宸t6
推荐于2016-04-18 · 超过27用户采纳过TA的回答
知道答主
回答量:79
采纳率:0%
帮助的人:89.3万
展开全部
只是一个递归调用的典型例子。

函数move(char x, char y)表示把把x杆上的最上面的一个盘子拿下来放到y杆上。

函数void hanoi( int n, char one, char two, char three ) 的作用是把位于one杆的所有n个盘子借助two杆移动到three杆上。

玩汉诺塔做法是,假设初始时1号杆上有n个盘子,盘子是顶上的盘子小越往下越大,这时候如果要把所有n个盘子从1号杆挪到3号杆的话,需要先把1号杆上上面的n-1个盘子放到2号杆上,然后把1号杆最底下那个最大的盘子放到3号杆上,这时候第一大步就完成了。下一步就是把2号杆上最低下那个最大的盘子借助1号杆移动到3号杆上。总之就是一大步把其余杆上最大的一个盘子放到3号杆上。当最后剩下一个盘子没有移动到3号杆的时候,只需要将这个盘子直接从其他杆拿到3号杆即可了。void hanoi( int n, char one, char two, char three ) 完成的就是上述的步骤喽。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
50ae3y
2010-01-29 · TA获得超过514个赞
知道小有建树答主
回答量:92
采纳率:0%
帮助的人:111万
展开全部
先看hanoi(汉诺塔)函数
如果n=1的情况下调用move函数,但刚开始n不可能等于1,所以选用else操作。
hanoi( n - 1, one , three, two ); 这里的意思是:盘子的总数等于n,所以先把n-1个盘子,通过第三个柱子挪到第二个柱子上。学过计算机的人知道,要想实现两数之间的交换,就必须借用第三个数,所以这里为了把n-1个盘子挪到第二个柱子上,就必须借用第三个柱子。然后调用move函数。move(one,three ); printf( "%c ---> %c\n", x, y );调用move函数之后,move函数的功能是把最后一个盘子挪到第三个柱子上,hanoi( n - 1, two, one, three ); 意思是当最后一个盘子已经挪到第三个柱子上之后,在把第二个柱子上的n-1个盘子通过第一个柱子挪到第三个柱子上。
这个算法的整体意思是在n=1的情况下,直接把盘子挪到第三个柱子上,在n>1的情况下,先把n-1个盘子挪到第二个柱子上,把最后一个盘子挪到第三个柱子上之后,再把在第二个柱子上的n-1个盘子通过第一个柱子挪到第三个柱子上。
move函数里的printf语句应该是为了显示盘子的调用过程。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
傲世修罗王
2010-01-24 · TA获得超过1085个赞
知道小有建树答主
回答量:1034
采纳率:0%
帮助的人:740万
展开全部
#include <stdio.h>

void Move(char a, char b)
{
printf("%c%s%c\n", a, " -> ", b) ;
}

void Hanoi(int n, char a, char b, char c)
{
if(n == 1) /* 如果当前只有一个盘子 */
Move(a, b) ; /* 直接由a柱子移动到b柱子 */
else /* 如果当前盘子数大于一个 */
{
Hanoi(n - 1, a, c, b) ; /* 现将上面n - 1个由柱子a移动到柱子c,中间借助柱子b */
Move(a, b) ; /* 然后将最低下的一个盘子由a移动到b */
Hanoi(n - 1, c, b, a) ; /* 最后将c柱子上的n-1个盘子移动到b柱子,中间借助a */
}
}

int main(int argc, char *argv[])
{
Hanoi(3, 'a', 'b', 'c') ; /* 将三个盘子从a柱子移动到b柱子,借助c柱子 */
system("pause") ;
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
渴侯夏侯菡pA
2010-01-31
知道答主
回答量:30
采纳率:0%
帮助的人:26.5万
展开全部
参考,自己写的。看看无害。

http://blog.csdn.net/wqfree/archive/2010/01/31/5274555.aspx

参考资料: http://blog.csdn.net/wqfree/archive/2010/01/31/5274555.aspx

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式