怎样用循环实现汉诺塔算法??

w_shd 2002-10-06 04:24:41
把盘子从桩1移动到桩3。
用递归实现汉诺塔是可以的:
#include <stdio.h>
void han(int,int,int,int);
main(){
int num;
int l1=1,l2=2,l3=3;
printf("Please input the number:");
scanf("%d",&num);
han(num,l1,l2,l3);
return 0;
}
void han(num,l1,l2,l3){
if(num==1)
printf("%d -> %d\n",l1,l3);
else{
han(num-1,l1,l3,l2);
printf("%d -> %d\n",l1,l3);
han(num-1,l2,l1,l3);
}
}
但是怎样用迭代的办法实现呢???
#include <stdio.h>
main(){
int num;
int i=1,j=1,k=1;
printf("Please input number:");
scanf("%d",&num);
if(num==1)
printf("1 -> 3");
else{
//怎样实现呢????
}

return 0;
}
...全文
405 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianliang79 2002-10-06
  • 打赏
  • 举报
回复
你看看是不是可以这样:

struct stackelement {
int platenum;
int src, aux, tar;
};

stackelement mystack[足够大];
stackelement tmp, tmp2;
int top = -1;

tmp.platenum = num;
tmp.src = 1;
tmp.aux = 2;
tmp.tar = 3;

stack[++top] = tmp;

while ( top >= 0 ) {
tmp = mystack[top--];

if ( platenum == 1 ) {
printf("%d -> %d", tmp.src, tmp.tar);
continue;
}

tmp2.platenum = tmp.platenum - 1;
tmp2.src = tmp.aux;
tmp2.aux = tmp.src;
tmp2.tar = tmp.tar;
mystack[++top] = tmp2;

tmp2.platenum = 1;
tmp2.src = tmp.src;
tmp2.aux = tmp.aux;
tmp2.tar = tmp.tar;
mystack[++top] = tmp2;

tmp2.platenum = tmp.platenum - 1;
tmp2.src = tmp.src;
tmp2.aux = tmp.tar;
tmp2.tar = tmp.aux;
mystack[++top] = tmp2;
}

hanoi问题是比较耗费堆栈的,用递归的方法时编译器负责管理堆栈的操作,一旦堆栈不够,操作系统会自动扩充,但对于这种方法就必须自己管理,限于时间关系,我没有给出扩充堆栈的方法,只是说要有“足够大”的堆栈空间,具体的改进有你自己做吧.
xzhuang 2002-10-06
  • 打赏
  • 举报
回复
用栈!手工构造一个栈,模拟递归
guide: 1、此程序为汉诺塔程序(此代码用到递归,包括直接递归和间接递归(间接递归是用在了重复使用本程序那块)); 2、此程序的代码流程是,由main函数进入之后,先后调用的函数是由上至下定义的; 3、亲爱的朋友,请尊重偶的版权,你也会得到相应的尊重哦! 4、若此程序或代码有不足或不对的地方,还望得到指正! 5、循环虽然比递归算法快,但比较而言,递归更容易让人理解! purpose: 1、培养独立思考算法的能力,特别是递归时,用到的是数学中的数列,找到整个递归的最先出栈的函数,以及数列的第n项与第n-1项的关系就能用递归解决问题; 2、通过试数来推算自己的程序逻辑是否有beg,并找出修复之; 3、熟练一下结构体和链表的基本推理,尤其是插入和删除元素时指针的走向! function: 1、简易输出汉诺塔步骤(由哪根柱子移到哪根柱子); 2、详细输出汉诺塔步骤(在功能1基础上逐步输出每次移动之后的盘子分布); 3、二维详细输出汉诺塔步骤(在前2功能基础上逐步输出二维盘子分布图); 4、动态二维输出汉诺塔步骤(在前3功能基础上演示动态输出并提示下一步); 5、可重复使用本程序! 在VC++6.0中的输出结果是: --------------------------- ………… 开始移动: 第1次移动过程: A(1号盘)→B 此时灰原の盘子分布图: A柱子 B柱子 C柱子 ↓ ↓ ↓ 1层为空层 第2层: 2* 1* 请按任意键继续. . . 第2次移动过程: A(2号盘)→C 此时灰原の盘子分布图: A柱子 B柱子 C柱子 ↓ ↓ ↓ 1层为空层 第2层: 1* 2* 请按任意键继续. . . 第3次移动过程: B(1号盘)→C 此时灰原の盘子分布图: A柱子 B柱子 C柱子 ↓ ↓ ↓ 第1层: 1* 第2层: 2* 请按任意键继续. . . 请问您是否要继续重玩游戏,需要重玩请按“Y”,否则按“N”结束程序! ………… ---------------------------

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧