汉诺塔代码(汉诺塔代码讲解视频)
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站长 原创,转载请注明出处和附带本文链接;
相关推荐
- 05-09网页代码,网页代码快捷键
- 05-06单页网站的代码(完整的网页代码)[20240506更新]
- 05-06个人主页图片代码(个人主页图片代码怎么弄)[20240506更新]
- 05-06提取微信名片代码(微信名片信息提取)[20240506更新]
- 05-06php后台权限管理代码(php管理员权限)[20240506更新]
- 05-06付费观看代码php(付费观看代码)[20240506更新]
- 05-06在线html执行代码(html怎么运行)[20240506更新]
- 05-06源代码管理资源管理器(资源管理器运行代码)[20240506更新]
- 05-06代码源软件库(程序代码库)[20240506更新]
- 05-06点击弹出密码代码(点击弹出密码代码错误)[20240506更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接