当前位置:首页 > 代码 > 正文

汉诺塔代码(汉诺塔代码讲解视频)

admin 发布:2022-12-19 04:43 102


今天给各位分享汉诺塔代码的知识,其中也会对汉诺塔代码讲解视频进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

汉诺塔的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上的盘子移到%d上\n",z1,z2);

solve(num-1,z3,z2,z1);

}

}

C语言汉诺塔问题非递归解法代码求大神讲解

int game2()要改为int main()后才可编译运行:

#includestdio.h

#includestdlib.h

#define CSZL 10

#define FPZL 10

typedef struct hanoi

{

int n;

char x,y,z;

}hanoi;

typedef struct Stack //定义栈结点

{

hanoi *base,*top;

int stacksize;

}Stack;

int InitStack(Stack *S)

{

S-base=(hanoi *)malloc(CSZL*sizeof(hanoi)); //申请栈空间

if(!S-base) //若申请不成功返回失败信息

return 0;

S-top=S-base; //置为空栈

S-stacksize=CSZL; //栈结点数

return 1;

}

int PushStack(Stack *S,int n,char x,char y,char z) //入栈

{

if(S-top-S-base==S-stacksize) //若栈已满

{

S-base=(hanoi *)realloc(S-base,(S-stacksize+FPZL)*sizeof(hanoi)); //补充申请,扩充栈空间

if(!S-base)   //若申请不成功返回失败信息

return 0;

S-top=S-base+S-stacksize; //重置栈顶指针

S-stacksize+=FPZL; //重置栈空间尺寸

}

S-top-n=n; //新结点信息存入栈顶结点

S-top-x=x;

S-top-y=y;

S-top-z=z;

S-top++; //栈中元素加1

return 1;

}

int PopStack(Stack *S,int *n,char *x,char *y,char *z) //出栈

{

if(S-top==S-base) //若栈已空

return 0; //返回出错信息

else

{

S-top--; //栈顶指针减1

*n=S-top-n; //返回出栈元素信息

*x=S-top-x;

*y=S-top-y;

*z=S-top-z;

return 1;

}

}

int EmptyStack(Stack *S) //判定是否空栈

{

if(S-base==S-top)

return 1;

else

return 0;

}

int i=1;

void Move(char x,char z) //打印移动盘子的信息

{

printf("\n\t\t第%d步,%c--%c",i++,x,z);

}

int main() /* 非递归法 */

{

int n;

char x,y,z;

Stack *S;

system("cls"); /*清屏指令*/

S=(Stack *)malloc(sizeof(Stack)); //申请栈空间

if(!S)

return 0;

if(!InitStack(S)) //初始化栈

return 0;

printf("请输入汉诺塔的初始盘子数量以及轴的名称:");

scanf("%d\t%c%c%c",n,x,y,z);

if(!PushStack(S,n,x,y,z)) //要移动的盘子数及各轴名称入栈

return 0;

while(!EmptyStack(S)) //当栈非空时循环

{

if(!PopStack(S,n,x,y,z)) //若空栈则退出循环,否则出栈一个任务

break;

if(n==1) //若只有一个盘子,直接移动

{

Move(x,z);

}

else //有1个以上的盘子时入栈(注意栈的工作特点,是后进先出,所以最先做的事要最后入栈)

{

if(!PushStack(S,n-1,y,x,z)) //将上层的n-1个盘子从y移向z

break;

if(!PushStack(S,1,x,y,z)) //将底层的盘子从x移向z

break;

if(!PushStack(S,n-1,x,z,y)) //将上层的n-1个盘子从x移向y

break;

}

}

free(S-base);

S-base=NULL;

S-top=NULL;

S-stacksize=0;

return 0;

}

汉诺塔C++代码

完整代码

int main()

{

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

int m;

cout"输入盘子数:"endl;

cinm;

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

}

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

{

void move(char x,char y);

if (n == 1)

{

move(one,three);

}

else

{

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

move(one,three);

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

}

}

void move(char x, char y)

{

coutx"--"yendl;

}

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

}

汉诺塔代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于汉诺塔代码讲解视频、汉诺塔代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/2567.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载