永发信息网

请高手帮我看看这段程序哪里出问题了(汉诺塔非递归)

答案:2  悬赏:0  手机版
解决时间 2021-05-02 00:40
  • 提问者网友:轻浮
  • 2021-05-01 03:05

#include<stdio.h>
#include<stdlib.h>

#define N 7
#define X dish[i].dnum
#define Y dish[i].lnum
#define SP dish[i].peg

int mov1(int,int);//向右挪一步
int mov2(int,int);//向右挪两步

struct dish
{
int dnum; //自身编号
int lnum; //下面的盘子
int peg; //所在的柱子
}dish[N];

int s[3]={N};//初始化每个柱的状态为空

void main()
{
int n;
int i,change=1,j;
for(i=0;i<N;i++)
{
dish[i].dnum=i; //作为盘子的唯一标识,顶层为0,最高级的最大盘子为N-1
dish[i].lnum=i+1; //底层盘子的下一层为N,即空柱
dish[i].peg=0; //初始化,所有盘子都在0柱
}
printf("请选择汉诺塔层数(1~7):");
scanf("%d",&n);
s[0]=0; //当前0柱上最顶端的盘子值

while(s[0]<N || s[1]<N)
{
j=0;
for(i=0;s[j]!=N || i<n;i++) //不为空柱则向下找盘子
{

if((n%2==0 && X%2==0)||(n%2==1 && X%2==1))
change=mov1(SP,X);
else change=mov2(SP,X);
if(!change)
{
if(s[0]<N && s[1]<N && s[2]<N)
{
for(int k=0;s[k]!=0;k++);
j=k;
}
else j=(j+1)%3; //该柱上没有盘子可以移动则更换柱子
}
}
}
}

int mov1(int sp,int x)
{ printf("\nmove1\n");
if(s[(sp+1)%3]>x)//要移动的目标是可以承载当前盘子的
{
printf("%d %d --> %d\n",x,sp,(sp+1)%3);
s[dish[x].peg]=dish[x].lnum; //x盘所在柱子减去当前盘,顶盘变为x盘的下一个
dish[x].lnum=s[(dish[x].peg+1)%3]; //x盘的落点即x转移后的下面的盘
s[(dish[x].peg+1)%3]=dish[x].dnum; //x盘转移到的柱子顶盘值变为x盘值
dish[x].peg=(dish[x].peg+1)%3; //x盘所在柱子变为落点柱子
return 1; //转移成功
}
else return 0; //转移失败
}

int mov2(int sp,int x)
{ printf("\nmove2\n");
if(s[(sp+2)%3]>x)//要移动的目标是可以承载当前盘子的
{
printf("%d: %d --> %d\n",x,sp,(sp+2)%3);
s[dish[x].peg]=dish[x].lnum; //x盘所在柱子减去当前盘,顶盘变为x盘的下一个
dish[x].lnum=s[(dish[x].peg+2)%3]; //x盘的落点即x转移后的下面的盘
s[(dish[x].peg+2)%3]=dish[x].dnum; //x盘转移到的柱子顶盘值变为x盘值
dish[x].peg=(dish[x].peg+2)%3; //x盘所在柱子变为落点柱子
return 1; //转移成功
}
else return 0; //转移失败
}

运行结果

最佳答案
  • 五星知识达人网友:上分大魔王
  • 2021-05-01 04:45

我来拿分了~~


以后 变量名 起的不一样一点 就不会混了~~~



汗 居然不能通过 还被扣分等了 - -



就是 大N和小n嘛 前后变量不一致,改完就行了~~


(害得我把表情类文字删除了 - -)

全部回答
  • 1楼网友:爱难随人意
  • 2021-05-01 06:22

同学 我给你说说你的程序吧。

首先 你的问题出在数组越界。

具体是38行左右的for(i=0;s[j]!=n-1 && i<n;i++)

然后你的程序中如何处理他的输入 似乎只能判断=7的情况。

还有你对越界的判断太少了 尤其是S[0]

我建议你重做下。QQ 506432728

共同学习交流

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯