汉诺塔c语言程序代码课程设计摘要(汉诺塔c语言编程)

http://www.itjxue.com  2023-03-07 06:23  来源:未知  点击次数: 

如何做一个C语言编程的汉诺塔游戏?要有源代码。

#includestdio.h

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

}

}

main()

{

int m;

printf("input the number of disks:");

scanf("%d",m);

printf("the step to moving %3d diskes:\n",m);

hanoi(m,'A','B','C');

}

算法介绍:

其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;

若n为奇数,按顺时针方向依次摆放 A C B。

(1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。

(2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。

(3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。

所以结果非常简单,就是按照移动规则向一个方向移动金片:

如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→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上搬过去的。

}

}

谁会用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);

getch();

}

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; /*最大的盘子代号为0,依次为1,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语言程序应该怎么写?并请说明一下原因

其实主要就是三个步骤:

第一,把a上的n-1个盘通过c移动到b。

第二,把a上的最下面的盘移到c。

第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。

#includestdio.h

?

void?move(int?n,char?a,char?b,char?c)

{

????if(n==1)

????????printf("\t%c-%c\n",a,c);????//当n只有1个的时候直接从a移动到c

????else

????{

????????move(n-1,a,c,b);????????????//第n-1个要从a通过c移动到b

????????printf("\t%c-%c\n",a,c);

????????move(n-1,b,a,c);????????????//n-1个移动过来之后b变开始盘,b通过a移动到c

????}

}

?

int?main()

{

????int?n;

????printf("请输入要移动的块数:");

????scanf("%d",n);

????move(n,'a','b','c');

????return?0;

}

用C语言代码来编写含汉诺塔问题,利用堆栈来实现.求代码

算法思想

对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 A 针移动到 C 针。若移动的圆盘为 n(n1),则分成几步走:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后一个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。

因此,解决汉诺塔问题可设计一个递归函数,利用递归实现圆盘的整个移动过程,问题的解决过程是对实际操作的模拟。

程序代码

#include stdio.h

int main()

{

int hanoi(int,char,char,char);

int n,counter;

printf("Input the number of diskes:");

scanf("%d",n);

printf("\n");

counter=hanoi(n,'A','B','C');

return 0;

}

int hanoi(int n,char x,char y,char z)

{

int move(char,int,char);

if(n==1)

move(x,1,z);

else

{

hanoi(n-1,x,z,y);

move(x,n,z);

hanoi(n-1,y,x,z);

}

return 0;

}

int move(char getone,int n,char putone)

{

static int k=1;

printf("%2d:%3d # %c---%c\n",k,n,getone,putone);

if(k++%3==0)

printf("\n");

return 0;

}

c语言中汉诺塔的代码怎么写?

我跟你说说吧!

#include stdio.h

#include string.h

#define OUT 0

#define IN 1

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表示三个底座。自己看看哦,很简单的

(责任编辑:IT教学网)

更多