问题描述:二维数组mg[M][N]它表示一个M×N的迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。
#include<stdio.h>
#define MaxSize 100
#define M 8
#define N 8
struct
{ int i,j; //方块在迷宫中的坐标位置(i,j)
int di; //下一个方块的方位号
} St[MaxSize];
int top=-1;
int mg[M+2][N+2]=
{
{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) //求解路径为:(xi,yi)->(xe,ye)
{ int i, j, di, i1, j1;
bool find;
top++;
St[top].i=xi; St[top].j=yi; St[top].di=-1; //初始方块进栈
mg[xi][yi]=-1; //避免重复走到该方块
while (top>-1)
{ i=St[top].i; j=St[top].j; //取栈顶方块(i,j)
di=St[top].di;
if (i==xe && j==ye) //找到了出口,输出该路径
{ printf("一条迷宫路径如下:\n");
for(int k=0;k<=top;k++)
printf("(%d,%d)", St[k].i, St[k].j);
printf("\n");
return true; //输出一条迷宫路径后返回true
}
find=false;
while(di<4 && !find)
{ di++;
switch(di)
{
case 0:i1=i-1; j1=j; break;
case 1:i1=i; j1=j+1; break;
case 2:i1=i+1; j1=j; break;
case 3:i1=i; j1=j-1; break;
}
if(mg[i1][j1]==0)//找到一个相邻可走方块,设置find为真
find=true;
}
if(find) //找到了一个相邻可走方块(i1,j1)
{ St[top].di=di; //修改原栈顶元素的di值
top++; //相邻可走方块进栈
St[top].i=i1; St[top].j=j1; St[top].di=-1;
mg[i1][j1]=-1; //(i1,j1)迷宫值置为-1避免重复走到该方块
}
else //没有路径可走,则退栈
{ mg[i][j]=0; //将栈顶方块退栈
top--; //让退栈方块的位置变为其他路径可走方块
}
}
return false; //表示没有可走路径
}
int main()
{
if (!mgpath(1,1,M,N))
printf("该迷宫问题没有解!");
return 1;
}