c语言中hanoi塔的编程,Hanoi(汉诺)塔问题,用c语言编程,程序如下:请帮忙把每一步程序加以说明,谢谢...

该博客介绍了一个汉诺塔游戏的C语言程序实现,包括移动过程、递归函数和图形界面操作。用户可以选择手动或自动控制游戏演示,并可以调整演示速度。程序通过初始化、移动操作和图形关闭等功能,实现汉诺塔的完整流程。
摘要由CSDN通过智能技术生成

/********hanoi.c*********/

#include 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(n<1||n>10)

n=10;/*越界的话n当10处理*/

if(computer)/*如果是自动控制的话输入速度*/

{

printf("please input speed: ");/*输入速度*/

scanf("%d",&speed);

}

initgraph(&gd,&gm,"c:\\tc");

cleardevice();

for(i=0;i<3;i++)

num[i].top=-1;/*三个地方的高度开始都为-1*/

for(i=0;i");

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

}

能不能追加点悬赏分啊?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值