永发信息网

关于汉诺塔非递归程序的解释

答案:1  悬赏:10  手机版
解决时间 2021-05-15 09:19
  • 提问者网友:锁深秋
  • 2021-05-14 17:26



void main();

#include <stdio.h>

#define width (rings+1)

void main()
{
int rings, last, next, x, z[500], s[3];

printf("how many rings? "); scanf("%d",&rings);

for(x=1; x<=rings; x++)
z[x]=width-x;
for(x=0; x<=2*width; x+=width)
z[x]=1000;



if(rings%2==0)
{
last=1; s[2]=0; s[1]=1;
z[width+1]=z[rings];
}
else
{
last=2; s[1]=0; s[2]=1;
z[2*width+1]=z[rings];
}

printf("from 1 to %d\n",last+1); s[0]=rings-1;

while(s[0]+s[1])
{


if(last==0) next=z[width+s[1]]<z[2*width+s[2]]?1:2;
if(last==1) next=z[s[0]]<z[2*width+s[2]]?0:2;
if(last==2) next=z[s[0]]<z[width+s[1]]?0:1;



if((z[next*width+s[next]]>z[last*width+s[last]])||
((z[last*width+s[last]]-z[next*width+s[next]])%2==0)) last=3-next-last;

printf("from %d to %d\n",next+1,last+1);

s[next]=s[next]-1; s[last]=s[last]+1;
z[last*width+s[last]]=z[next*width+s[next]+1];
}
}

请帮我把关键的地方尤其是WHILE循环里的判断条件为什么要这样判断说一下!!

最佳答案
  • 五星知识达人网友:一叶十三刺
  • 2021-05-14 18:49
你好。
很幸运看到你的问题。
但是又很遗憾到现在还没有人回答你的问题。也可能你现在已经在别的地方找到了答案,那就得恭喜你啦。
可能是你问的问题有些专业了,没人会。或者别人没有遇到或者接触过你的问题,所以帮不了你。建议你去问题的相关论坛去求助,那里的人通常比较多,也比较热心,可能能快点帮你解决问题。
希望我的回答也能够帮到你!
祝你好运~!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯