Usa colas para resolver problemas de laberintos

Descripción del problema: La matriz bidimensional mg [M] [N] representa un laberinto M × N , donde 1 representa la pared y 0 representa el camino que se puede recorrer. Solo se puede caminar horizontal o verticalmente, no en diagonal. Es necesario que el programa encuentre la ruta desde la esquina superior izquierda hasta la esquina inferior derecha.

#include<stdio.h>
#define MaxSize 100
#define M 8
#define N 8
typedef struct
{   int i,j;    //方块在迷宫中的坐标位置(i,j)         
    int pre;    //本路径中上一方块在队列中的下标   
} SqQueue; 
SqQueue Qu[MaxSize];  //定义顺序非循环队列
int front=0,rear=0; 
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}
};
void print(SqQueue Qu[],int front)
{   int k=0;
    for(int i=front;i>0;i=Qu[i].pre)
    {
        printf("(%d,%d) ",Qu[i].i,Qu[i].j);
        k++;
        if(k%5==0)   //每输出每5个方块后换一行
           printf("\n");
    }
}
bool mgpath1(int xi,int yi,int xe,int ye)	//搜索路径为:(xi,yi)->(xe,ye)
{   int i, j, di, i1, j1;
    rear++;
    Qu[rear].i=xi; Qu[rear].j=yi; Qu[rear].pre=-1; //(xi,yi)进队
    mg[xi][yi]=-1;		        //将其赋值-1,以避免回过来重复搜索
    while(front!=rear)		    //队不空循环
    {   front++;
        i=Qu[front].i; j=Qu[front].j; //出队
        if (i==xe && j==ye)	    //找到了出口,输出路径
        {   print(Qu, front);	//调用print函数输出路径
            return true;		//找到一条路径时返回真
        }
        for (di=0;di<4;di++)    //循环扫描每个方位
        {	
          switch(di)
          {
            case 0:i1=i-1;   j1=j; break;
            case 1:i1=i;  j1=j+1; break;
            case 2:i1=i+1;  j1=j; break;
            case 3:i1=i;   j1=j-1; break;
          }
          if (mg[i1][j1]==0)
          {   rear++;
              Qu[rear].i=i1; Qu[rear].j=j1; 
              Qu[rear].pre=front;	//(i1,j1)方块进队
              mg[i1][j1]=-1;	//将其赋值-1
          }
        }//for
    }//while
    return false;
}//mgpath1

int main()
{ 
    if (!mgpath1(M,N,1,1))
        printf("该迷宫问题没有解!");
    return 1;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_42467709/article/details/82048682
Recomendado
Clasificación