#include
#define M 8
#define N 8
#define MaxSize 100//这三个后面不需要加分号
//开始MaxSize取10,会出现越界问题
typedef struct
{
int i,j;//方块的位置
int pre;//本路径中,上一个方块在队列中方的下标
}Box;//方块的类型
typedef struct
{
Box data[MaxSize];
int front,rear;//队头指针和队尾指针
}QuType;//定义顺序队的类型
void print(QuType qu,int front);
bool mypath1(int xi,int yi,int xe,int ye);//设置搜索路径
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 mypath1(int xi,int yi,int xe,int ye)//设置搜索路径
{
int i,j,find=0,di;
QuType qu;//定义顺序队
qu.front=qu.rear=-1;//初始化队为空
qu.rear++;//队尾加入元素
qu.data[qu.rear].i=xi;//为什么在后面跟着i和j?//队里面的元素是一个二维数组所以加上i和j
qu.data[qu.rear].j=yi;//(xi,yi)进队
qu.data[qu.rear].pre=-1;//进队数据设为-1//队尾前面的数据设为-1
mg[xi][yi]=-1;//将值设为-1避免回过来重复搜索
while(qu.front!=qu.rear&&!find)//队列不为空,且未找到路径时循环//find开始定义为0,这里find=1,表示的是墙
{
qu.front++;//出队,由于不是环形队列,该出队元素仍在队列中
i=qu.data[qu.front].i;
j=qu.data[qu.front].j;
if(i==xe&&j==ye)//找到了出口,输出路径
{
find=1;//如果是墙
print(qu,qu.front);//调用printf函数输出路径
return true;//找到一条路时返回true//视频上是return 1;
}
//找可行路径
for(di=0;di<4;di++)//在开头定义
{
switch(di)//在这里di找路的时候循环4次
{
case 0:i=qu.data[qu.front].i-1;j=qu.data[qu.front].j;break;//上
case 1:i=qu.data[qu.front].i;j=qu.data[qu.front].j+1;break;//右
case 2:i=qu.data[qu.front].i+1;j=qu.data[qu.front].j;break;//下
case 3:i=qu.data[qu.front].i;j=qu.data[qu.front].j-1;break;//左
//顺时针
}
//解析qu.data[qu.rear].i
//qu指顺序队,、qu.data[]指顺序队里的box方块的数据。i,j是方块的位置坐标
if(mg[i][j]==0)//如果这个方格可行
{
qu.rear++;//队尾加
qu.data[qu.rear].i=i;
qu.data[qu.rear].j=j;//把找到的可行方块放入队尾
qu.data[qu.rear].pre=qu.front;//现在的队的前一个元素是之前的一个方块
mg[i][j]=-1;
}
}
}
return false;//return 0;
}
void print(QuType qu,int front)//从队列qu中输出路径
{
int k=front,j,ns=0;
printf("\n");
do//反向找到最短路径,将该路径上的方块的pre成员设置成-1
{
j=k;
k=qu.data[k].pre;//k已经是front了,为什么还要pre?
//k=front是把形参里的front赋给k,而front其实是一个下标,就是个整数
//k=qu.data[k].pre是把每个方块前面的下标赋给k,反向找最短路径包含的下标值
qu.data[j].pre=-1;
}while(k!=0);//这个地方还有一个分号,切记
printf("迷宫路径如下:\n");
k=0;
while(k
运行结果:
你可能感兴趣的:(数据结构)