#include "Stdio.h"
#include "Conio.h"
#define m 5
#define n 5
#define NUM m*n
typedef struct
{
int x,y;
int pre;
}sqtype;
typedef struct
{
int dx;
int dy;
}moved;
void printpath(sqtype sq[],int rear)
{
int i;
i=rear;
do
{
printf("(%d,%d)/n",sq[i].x,sq[i].y);
i=sq[i].pre;
}while(i!=-1);
}
void restore(int (*p)[n])
{
int i,j;
for(i=1;i<=m-2;i++)
for(j=1;j<=n-2;j++)
{
if((*(p+i))[j]==-1)
(*(p+i))[j]=0;
}
}
void showMaze(int maze[m][n])
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%d",maze[i][j]);
}
printf("/n");
}
}
int shortpath(int maze[m][n],moved move[4])
{
sqtype sq[NUM];
int front,rear;
int x,y,i,j,v;
front=rear=0;
sq[0].x=1; sq[0].y=1; sq[0].pre=-1; /*-1表示起点下标*/
maze[1][1]=-1; /*-1表示搜索过了*/
while(front<=rear)
{
x=sq[front].x; y=sq[front].y;
for(v=0;v<4;v++)
{
i=x+move[v].dx; j=y+move[v].dy;
/* (i,j)为前进方向 */
if(maze[i][j]==0) /*可走*/
{
rear++; /*入队*/
sq[rear].x=i;
sq[rear].y=j;
sq[rear].pre=front;
maze[i][j]=-1; /*避免重复搜索*/
}
if(i==m-2 && j==n-2)
{
printpath(sq,rear); /* 打印迷宫 */
restore(maze); /*恢复迷宫,使maze中-1全变成0*/
return 1;
}
}
front++;
}
return 0;
}
main()
{
int maze[m][n]={
{1,1,1,1,1},
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1},
{1,1,1,1,1},
};
int result;
moved move[4];
/*四个方向位移*/
move[0].dx=1; /*南*/
move[0].dy=0;
move[1].dx=0; /*东*/
move[1].dy=1;
move[2].dx=0; /*西*/
move[2].dy=-1;
move[3].dx=-1; /*北*/
move[3].dy=0;
showMaze(maze);
result= shortpath(maze,move);
getch();
}