递归算法求解迷宫问题
typedef struct
{
int i; //当前方块的行号
int j; //当前方块的列号
} Box;
typedef struct
{
Box data[MaxSize];
int length; //路径长度
} PathType; //定义路径类型
int count=0; //存放迷宫路径的条数
void mgpath(int xi,int yi,int xe,int ye,PathType path) //求解路径为:(xi,yi)->(xe,ye)
{
int di,k,i,j;
if (xi==xe && yi==ye) //找到了出口,输出路径
{
path.data[path.length].i = xi;
path.data[path.length].j = yi;
path.length++;
printf("迷宫路径%d如下:\n",++count);
for (k=0;k<path.length;k++)
printf("\t(%d,%d)",path.data[k].i,path.data[k].j);
printf("\n");
}
else //(xi,yi)不是出口
{
if (mg[xi][yi]==0) //(xi,yi)是一个可走方块
{
di=0;
while (di<4) //找(xi,yi)的一个相邻方块(i,j)
{
switch(di)
{
case 0:i=xi-1; j=yi; break;
case 1:i=xi; j=yi+1; break;
case 2:i=xi+1; j=yi; break;
case 3:i=xi; j=yi-1; break;
}
path.data[path.length].i = xi;
path.data[path.length].j = yi;
path.length++;
mg[xi][yi]=-1; //避免重复找路径
mgpath(i,j,xe,ye,path);
path.length--; //回退一个方块
mg[xi][yi]=0; //恢复(xi,yi)为可走
di++;
}
}
}
}
#define max 100
typedef struct{
int x[max];
int y[max];
int top;
}stack;
int mg[6][6]={
{1,1,1,1,1,1},
{1,0,1,1,1,1},
{1,0,1,0,0,1},
{1,0,0,0,0,1},
{1,1,1,1,0,1},
{1,1,1,1,1,1}
};
void findout(int map[][6],int x,int y,int endx,int endy,stack s){
if(x==endx&&y==endy){
++s.top;s.x[s.top]=x;s.y[s.top]=y;
for(int i=0;i<=s.top;++i)
printf("[%d](%d,%d) ",i+1,s.x[i],s.y[i]);
printf("\n");--s.top;return;
}
if(map[x][y+1]==0||map[x][y-1]==0||map[x+1][y]==0||map[x-1][y]==0){
map[x][y]=-1;++s.top;s.x[s.top]=x;s.y[s.top]=y;
if(map[x][y+1]==0) findout(map,x,y+1,endx,endy,s);
if(map[x][y-1]==0) findout(map,x,y-1,endx,endy,s);
if(map[x+1][y]==0) findout(map,x+1,y,endx,endy,s);
if(map[x-1][y]==0) findout(map,x-1,y,endx,endy,s);
map[x][y]=0;--s.top;
}
}
void printmap(int map[6][6]){
printf("地图:\n");
for(int i=0;i<6;i++){
for(int j=0; j<6;j++){
printf("%d",map[i][j]);
}
printf("\n");
}
}
int main()
{ stack s={{0},{0},-1};
printf("路线:\n");
findout(mg,1,1,4,4,s);
return 1;
}