#include <stdio.h>
#define MaxSize 100
#define M 8
#define N 8
void prints(int s[10][10])
{
int i,j;
for(i=0;i<10;i++)
{ for(j=0;j<10;j++)
{if(s[i][j]==1)printf("█");
else if(s[i][j]==0)printf(" ");
else if(s[i][j]==2)printf(" ");
else printf("●");
}printf("/n");
}
}
int mg[M+2][N+2]=
{
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,1,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}
};
struct
{ int i,j; /*方块的位置*/
int pre; /*本路径中上一方块在Qu中的下标*/
} Qu[MaxSize];
int front=-1,rear=-1; /*分别为队首指针和队尾指针*/
void print(int front) /*从队列中输出路径*/
{
int k=front,j;
do /*反向找到最短路径,将该路径上的方块的pre成员设置成-1*/
{ j=k;
k=Qu[k].pre;
Qu[j].pre=-1;
} while (k!=0);
k=0;
while (k<MaxSize) /*正向搜索到pre为-1的方块,即构成正向的路径*/
{ if (Qu[k].pre==-1)
{ mg[Qu[k].i][Qu[k].j]=3;//将正向路径中的方块都置为3,作为标记
}
k++;
}
}
int mgpath(int xi,int yi,int xe,int ye) /*搜索路径为:(xi,yi)->(xe,ye)*/
{
int i,j,find=0,di;
rear++;
Qu[rear].i=xi;Qu[rear].j=yi; /*(xi,yi)进队*/
Qu[rear].pre=-1;
mg[1][1]=-1; /*将其赋值-1,以避免回过来重复搜索*/
while (front<=rear && !find) /*队列不为空且未找到路径时循环*/
{
front++; /*出队,由于不是环形队列,该出队元素仍在队列中*/
i=Qu[front].i;j=Qu[front].j;
if (i==xe && j==ye) /*找到了出口,输出路径*/
{
find=1;
print(front); /*调用print函数输出路径*/
return(1); /*找到一条路径时返回1*/
}
for (di=0;di<4;di++) /*循环扫描每个方位,把每个可走的方块插入队列中*/
{
switch(di)
{case 1:i=Qu[front].i;j=Qu[front].j+1;break;
case 3:i=Qu[front].i,j=Qu[front].j-1; break;
case 2:i=Qu[front].i+1;j=Qu[front].j;break;
case 0:i=Qu[front].i-1;j=Qu[front].j;break;
}
if (mg[i][j]==0)
{ rear++; /*将该相邻方块插入到队列中*/
Qu[rear].i=i;Qu[rear].j=j;
Qu[rear].pre=front; /*指向路径中上一个方块的下标*/
mg[i][j]=2; /*将其赋值-1,以避免回过来重复搜索*/
}
}
}
return(0); /*未找到一条路径时返回1*/
}
int main()
{int i,j=0;
system("title 少杰的迷宫@Jokers_i");
system("color 3b");
printf("迷宫如下,你知道怎么走出去吗?输入“4”就能显示答案哦!/n");
prints(mg);
scanf("%d",&i);
if(i==4)
{ printf("迷宫路径如下:/n");
printf("耗时%GS==%i/n",clock()/1000.0,clock());
mgpath(1,1,M,N);
prints(mg);printf("耗时%GS/n",clock()/1000.0);
}
//else printf("其实你真的很笨!");
system("pause");
return 0;}