c语言中汉诺塔的代码怎么写?我跟你说说吧!
#include stdio.h
#include string.h
#define OUT 0
#define IN1
void
move( int n, int x, int y, int z )
{
if ( n == 1 )
printf ( "%d--%d\n", x, z );
else
{
move( n - 1, x, z, y );
printf( "%d--%d\n", x, z );
move( n - 1, y, x, z );
}
}
int
main( int argc ,char *argv[] )
{
int h;
printf( "Input how many hanio there are:" );
scanf( "%d", h );
printf( "The result is :\n" );
move( h, 1, 2, 3 );
getchar();
return ( 0 );
}
其中子函数的x,y,z表示三个底座 。自己看看哦,很简单的
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上
【c语言汉诺塔函数怎么编写 c语言中汉诺塔】tower(x-1,b,a,c); //最后再将b上的x-1层塔按照规律搬到c上,注意参数b放在开头,因为x-1层是要从b上搬过去的 。
}
}
汉诺塔的C语言代码怎么写#includestdio.h
void
solve(int
num,int
z1,int
z2,int
z3);
void
main()
{
int
n;
printf("请输入盘子数量:");
scanf("%d",n);
solve(n,1,2,3);
}
void
solve(int
num,int
z1,int
z2,int
z3)
{
if(num0){
solve(num-1,z1,z3,z2);
printf("把%d上c语言汉诺塔函数怎么编写的盘子移到%d上\n",z1,z2);
solve(num-1,z3,z2,z1);
}
}
汉诺塔的C语言代码怎么写啊/*5. 源程序*/
/********hanoi.c*********/
#include graphics.h
struct H
{
int data[15];/*存放每个盘的代号*/
int top;/*每个塔的具体高度*/
}num[3];/*三个塔*/
void move(char x,char y,struct H num[3]);/*移动的具体过程*/
void hanoi(char x,char y,char z,int n,struct H num[3]);/*递归*/
void Init(void);/*初始化*/
void Close(void);/*图形关闭*/
int computer=1;/*自动控制与手动控制的标志*/
int speed=0;/*全局变量speed主要是演示过程的速度*/
void main(void)
{
Init();/*初始状态*/
Close();/*图形关闭*/
exit(0);
}
void Init(void)/*初始化*/
{
int gd=DETECT,gm;
int i,n,color;
clrscr();
printf("please input n(n=10): ");/*输入要演示的盘子数*/
scanf("%d",n);
printf("Please input 1 or 2:\n1.computer 2.people\n");
scanf("%d",i);
if(i==2)/*选择手动控制标志为0*/
computer=0;
if(n1||n10)
n=10;/*越界的话n当10处理*/
if(computer)/*如果是自动控制的话输入速度*/
{
printf("please input speed: ");/*输入速度*/
scanf("%d",speed);
}
initgraph(gd,gm,"c:\\tc");
cleardevice();
for(i=0;i3;i)
num[i].top=-1;/*三个地方的高度开始都为-1*/
for(i=0;in;i)/*画一开始的塔座A上的盘子*/
{
num[0].top;/*栈的高度加1*/
num[0].data[num[0].top]=i; /*最大的盘子代号为0c语言汉诺塔函数怎么编写,依次为1c语言汉诺塔函数怎么编写,2,…n-1*/
color=num[0].data[num[0].top] 1;/*盘子的颜色代码为栈顶盘子代号加1*/
setfillstyle(SOLID_FILL,color);
bar(100-(33-3*num[0].data[num[0].top]),400-20*i-8,100
(33-3*num[0].data[num[0].top]),400-20*i 8); /*画矩形*/
}
setcolor(YELLOW);
outtextxy(180,450,"any key to continue");
settextstyle(0,0,2);
outtextxy(90,420,"A"); /*塔座标志*/
outtextxy(240,420,"B");
outtextxy(390,420,"C");
getch();/*接收字符后就执行递归操作*/
hanoi('a','b','c',n,num);
}
void move(char x,char y,struct H num[3])/*移动的具体过程*/
{
int i;
char num1[3],num2[3];
sprintf(num1,"%c",x-32);/*将小写变成大写 , 并转换成字符串输出*/
sprintf(num2,"%c",y-32);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(0,0,640,60);
setcolor(RED);
outtextxy(150,30,num1);/*输出移动过程*/
outtextxy(200,30,"---");
outtextxy(310,30,num2);
settextstyle(0,0,2);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(100 150*(x-97)-(33-3*num[x-97].data[num[x-97].top]),
400-20*num[x-97].top-8,100 150*(x-97) (33-3*
num[x-97].data[num[x-97].top]),400-20*num[x-97].top 8);
num[y-97].top;/*入栈,目标点的top加1*/
num[y-97].data[num[y-97].top]=num[x-97].data[num[x-97].top];/*在目标点盘子的代号与源点盘子的代号相同*/
num[x-97].top--;/*出栈,原来地方的top减1*/
setfillstyle(SOLID_FILL,num[y-97].data[num[y-97].top] 1);/*盘子颜色代码是栈顶盘子代号加1*/
bar(100 150*(y-97)-(33-3*num[y-97].data[num[y-97].top]),
400-20*num[y-97].top-8,100 150*(y-97)
(33-3*num[y-97].data[num[y-97].top]),400-20*num[y-97].top 8);
if(computer)/*自动控制就用delay*/
delay(speed);/*延时函数*/
else
getch();/*手动控制的话就自己按键盘来控制*/
}
void hanoi(char one,char two,char three,int n,struct H num[3])/*递归n为盘子数,num为堆栈*/
{
if(n==1)
move(one,three,num);/*如果盘子为1,将这个盘子从塔座A移动到塔座C*/
else
{
hanoi(one,three,two,n-1,num);/*将塔座A的前n-1个盘子移到塔座B*/
move(one,three,num);/*将塔座A的第n个盘子移到塔座C*/
hanoi(two,one,three,n-1,num); /*将塔座B的n-1个盘子移到塔座C*/
}
}
void Close(void)/*图形关闭*/
{
getch();
closegraph();
}
c语言汉诺塔函数怎么编写的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言中汉诺塔、c语言汉诺塔函数怎么编写的信息别忘了在本站进行查找喔 。
推荐阅读
- 体育游戏后放松视频教案,体育课后放松游戏
- 航天拍摄主题是什么,航天摄影在哪方面有着重要的作用
- 最强大冒险游戏2解说是谁,最强大冒险2v10
- 为什么斗鱼不显示直播,为什么斗鱼不显示直播回放
- vb.net能开bs吗 vbnet adodb
- 电商如何赋能,电商如何赋能企业发展
- excel如何排序后合计,excel合计排序怎么排
- 吃饭的直播素材,吃饭的直播素材
- 怎么上传mysql备份 mysql怎么备份表数据