当前位置:首页 » 编程语言 » c语言编写汉诺塔
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言编写汉诺塔

发布时间: 2023-05-15 03:39:20

A. c语言用递归实现汉诺塔

见代码注释,还有不懂可以问。

#include<stdio.h>
voidmove(charx,chary)
{
printf("%c-->%c ",x,y);
}
//hannuota函数的作用:把n个圆盘从one柱子借助two柱子放到three柱子
voidhannuota(intn,charone,chartwo,charthree)
{
if(n==1)//如果只有一个柱子
move(one,three);//直接移动即可
else
{
hannuota(n-1,one,three,two);//先把one柱子上的n-1个圆盘借助three柱子移动到柱子two
move(one,three);//把第一个柱子的剩下那一个(第n个)移动到第三个柱子
//由于原来one柱子上的n-1个圆盘已经移动到了two柱子上,因此不会有圆盘挡住n圆盘出来
hannuota(n-1,two,one,three);
//最后再把那n-1个圆盘从two柱子借助one柱子移动到three柱子
//(上面第一句话hannuota(n-1,one,three,two)已经移动到了two柱子,因此这里是从two柱子移动到three柱子)
}
}
intmain()
{
intm;
printf("inputthenumberofdiskes:");
scanf("%d",&m);
printf("Thesteptomove%ddiskes: ",m);
hannuota(m,'A','B','C');
return0;
}

B. C语言汉诺塔

根据汉诺塔的游戏规则可知,若只有一个盘子,则只要直接搬运就可以了,其它的不需要再做。return语句的作用,就是遇到它时,程序直接返回到调用它的地方,不再执行此函数中return语句以后的代码。

不过这里这个return语句也可以不写,只是代码要稍作更改(代码的执行还是不变的,即与更改前完全等价):

voidhanNuoTa(intn,charfrom,charto,charhelper)
{
if(n==1)
{
printf("%c--->%c ",from,to);
}
else
{
hanNuoTa(n-1,from,helper,to);
printf("%c--->%c ",from,to);
hanNuoTa(n-1,helper,to,from);
}
}

C. C语言汉诺塔程序

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

D. c语言 汉诺塔

因为if (n==1) printf("%c-->%c\n",a,c)这里少输入了一个分号档兆团,在后面加上;就可以行橘了

main()
{hanoi(3,'A','B','C');
}

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);}
}

E. C语言编程(汉诺塔问题)

move(n-1,x,z,y);——这句是调用函数,这个函数就是前面声明的:void move(int n,int x,int y,int z)
printf("%c-->%c",x,z);——这句是输出,%c 是指按CHAR型输出,"%c-->%c",就是输出两个CHAR型数据,中间用-->连接。而这两个CHAR的数据就是x和z。比如结果是:a-->c
move(n-1,y,x,z);——这句还是调用函数,这个函数就是前面声明的:void move(int n,int x,int y,int z)