数据结构第四版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=-1; 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)时
时间: 2024-09-29 08:28:18