课本迷宫代码

#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

运行结果:

课本迷宫代码_第1张图片

你可能感兴趣的:(数据结构)