在贺老师指出问题之后才发现原来书上代码是没问题的,完全是我的原因,不过这样也好,让我从刚开始的只懂了六七到了完全懂了,这也是一个过程,虽然我的编程能力不强但是我相信只要努力就会有结果的,专心于一件事!下面我犯的错可以忽略了。。。
栈顶的值被保留用于回溯时不重复走原来的路径!
分割线·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~QAQ
数据结构第四版p79页迷宫问题我觉得存在BUG,下图盗用贺老师就会的QAQ,也希望贺老师能看到帮忙解答一下啦。
BUG: 程序从起始点(1,1)开始寻找路径,在当前点进行判断其上下左右是否存在可走点,如果从(1,1)点开始判断如图那么它的右(1,2)下(2,1)都是可走点那么将右边的格子坐标进栈呢还是将下边的格子坐标进栈?书本上给的代码是先判断上边格子再判断右边格子再判断下边格子再判断左边格子,这就造成了一个问题:(1,2)则个点会被进栈(因为(1,2)点位于(1,1)点的右边被先判断进栈),那么接下来的路径会变成固定的(1,1)->(1,2)->(2,2)->(3,2)->(3,3)->(3,4)->(2,4)->(1,4)->(1,5)->(1,6)->(2,6)->(2,5)
这样的话就会到(2,5)就会停止,根本不会达到查找其他路径的目的。
-------------------------------------------------
#include<iostream>
#include<malloc.h>
#define MaxSize 100
using namespace std;
typedef struct
{
int i;
int j;
int di;
} Box;
typedef struct
{
Box data[MaxSize];
int top;
} StType;
int mg[10][10]=
{
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
bool mgpath(int xi,int yi,int xe,int ye)
{
int i,j,k,di,find;
StType st;
st.top=-1;
st.top++;
st.data[st.top].i=xi;
st.data[st.top].j=yi;
st.data[st.top].di=-1;
mg[xi][yi]=-1;
while(st.top>-1)
{
i=st.data[st.top].i;
j=st.data[st.top].j;
di=st.data[st.top].di;
if(i==xe&&j==ye)
{
cout<<"迷宫路径如下:"<<endl;
for(k=0; k<=st.top; k++)
{
cout<<"("<<st.data[k].i<<","<<st.data[k].j<<")";
if((k+1)%5==0)
cout<<endl;
}
cout<<endl;
return true;
}
find=0;
while(di<4&&find==0)
{
di++;
switch(di)
{
case 0:
i=st.data[st.top].i-1;
j=st.data[st.top].j;
break;
case 1:
i=st.data[st.top].i;
j=st.data[st.top].j+1;
break;
case 2:
i=st.data[st.top].i+1;
j=st.data[st.top].j;
break;
case 3:
i=st.data[st.top].i;
j=st.data[st.top].j-1;
break;
}
if(mg[i][j]==0)
find=1;
}
if(find==1)
{
st.data[st.top].di=di;
st.top++;
st.data[st.top].i=i;
st.data[st.top].j=j;
st.data[st.top].di=-1;
mg[i][j]=-1;
}
else
{
mg[st.data[st.top].i][st.data[st.top].j]=0;
st.top--;
}
}
return false;
}
int main()
{
mgpath(1,1,3,1);
}
目的点为(2,5)时
==============================
目的点为(3,1)时