/*用栈求解迷宫问题*/
#include
#define maxsize 100
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}
};//地图
int M=8;//行数
int N=8;//列数
bool mgpath(int x,int y,int xe,int ye)
{
BOX path[maxsize];
int k=0,di=-1,i,j,find=0;
stType s;
s.top=-1;
s.top++;
s.data[s.top].i=x;
s.data[s.top].j=y;
s.data[s.top].di=-1;
mg[x][y]=-1; //将入口处的迷宫值设为-1避免重复走到该处
while(s.top!=-1)
{
di=s.data[s.top].di;//原因:若栈顶元素是第一次做栈顶则:每个栈的栈顶元素的di值均为-1
//若栈顶元素是第二次做栈顶即曾进栈过一个元素,但这个元素无相邻的可走方块从而回退到栈顶元素,
//则应从目前栈顶元素di的di+1方向开始找,
//因为刚刚di之前的已经找过路了,di方向对应的元素方块无相邻的可走方块
if(s.data[s.top].i==xe&&s.data[s.top].j==ye)
{
printf("迷宫路径如下:\n");
while(s.top!=-1)
{
path[k++]=s.data[s.top];
s.top--;
}
while(k>=1)
{
k--;
printf("\t(%d,%d)",path[k].i,path[k].j);
if((k+2)%5==0)
printf("\n");
}
return true;
}
else
{
find=0;
while(di<=3)
{
printf("di1:%d\n",di);
printf("------------\n");
di++;
printf("di:%d\n",di);
if (di==1)
{
i=s.data[s.top].i;
j=s.data[s.top].j+1;
}
else if(di==2)
{
i=s.data[s.top].i+1;
j=s.data[s.top].j;
}
else if(di==3)
{
i=s.data[s.top].i;
j=s.data[s.top].j-1;
}
else if(di==0)
{
i=s.data[s.top].i-1;
j=s.data[s.top].j;
}
if (mg[i][j]==0)
{
s.data[s.top].di=di;
s.top++;
s.data[s.top].di=-1;
s.data[s.top].i=i;
s.data[s.top].j=j;
find=1;
mg[i][j]=-1;
break;
}
}
printf("===========\n");
if(find==0)
{
mg[s.data[s.top].i][s.data[s.top].j]=0;
s.top--;
}
}
}
return false;
}
int main()
{
if(mgpath(1,1,M,N)!=true)
printf("false!!\n");
return 0;
}
函数:
bool mgpath(int x,int y,int xe,int ye)
{
qutype q;
int i,j;
q.front=q.rear=-1;
q.rear++;
q.data[q.rear].i=x;
q.data[q.rear].j=y;
q.data[q.rear].pre=-1;
mg[x][y]=-1;
while(q.rear!=-1)
{
q.front++;
i=q.data[q.front].i;
j=q.data[q.front].j;
if (i==xe&&j==ye)
{
print(q,q.front);
return true;
}
else
{
for(int di=0;di<4;di++)
{
if (di==1)
{
i=q.data[q.front].i;
j=q.data[q.front].j+1;
}
else if(di==2)
{
i=q.data[q.front].i+1;
j=q.data[q.front].j;
}
else if(di==3)
{
i=q.data[q.front].i;
j=q.data[q.front].j-1;
}
else if(di==0)
{
i=q.data[q.front].i-1;
j=q.data[q.front].j;
}
if(mg[i][j]==0)
{
q.rear++;
q.data[q.rear].i=i;
q.data[q.rear].j=j;
q.data[q.rear].pre=q.front;
mg[i][j]=-1;
}
}
}
}
return false;
}
完整代码:
#include
#define maxsize 100
typedef struct
{
int i; //行号
int j; //列号
int pre; //上一个方块的下标
}BOX;
typedef struct
{
BOX data[maxsize];
int front,rear;
}qutype;
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}
};//地图
int M=8;//行数
int N=8;//列数
void print(qutype q,int front)
{
printf("ok!\n");
int k=front,k1;
printf("k:%d\n",k);
do
{
k1=k;
k=q.data[k].pre;
// printf("k:%d\n",k);
q.data[k1].pre=-1;
}while(k!=0);
printf("路径如下:\n");
for(int k=0;k