永发信息网

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

答案:2  悬赏:0  手机版
解决时间 2021-05-02 00:40

#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; //转移失败
}

运行结果

最佳答案

我来拿分了~~


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



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



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


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

全部回答

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

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

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

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

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

我建议你重做下。QQ 506432728

共同学习交流

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么走才最快 最近 不走重复的路
首之都公馆东门(人行门)地址有知道的么?有点
民族团结的名言名句,关于民族团结的名言
阿斗是谁所生?
莆田哪里有批发做寿司用的海苔(超市除外)
今天上农场怎么总是操作失败????????
可有麦坚拿时间曲线软件
与二有关的口号
金利源商店怎么去啊,有知道地址的么
请高人 帮忙设计 QQ网名
继续学习浏览23小时 这是什么意思
声卡错乱,没音
金希澈模仿Lady gaga那时候的几首歌分别叫什
《故乡过年》(莫言)
放入黑名单又出了了
推荐资讯
我想问问我是1990年11月10日的,我的爱情和财
找一首哈狗帮的歌开头是狗狗叫
什么是寂寞孤独?
飞车.炫舞
求 !一好点的QQ名字
天龙八部不会更新
问道如何自己做套装?请高手给我说说你的决招
松下没出产过手机?
十八岁应该谈恋爱吗
QQ的游戏人生怎么开通
电脑屏幕小、怎样才能采它弄大?急急急!!!
怎么获得QQ宠物猪猪跟熊熊?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?