Problema del laberinto de estructura de datos
#include lt; malloc.hgt;
#include lt; describe la posición actual y la dirección del laberinto*
int x;
int y
int way; dirección p>{
int x;
int y
int manera; /*0: no válido, 1: izquierda, 2: abajo, 3: derecha, 4: Arriba*/
}P;
typedef struct LinkNode /*LinkNode /*Estructura de pila del tipo de elemento*/
{
P pos;
struct LinkNode *next;
}LinkNode;
typedef struct stack /* pila de cadena, utilizada para almacenar información de rutas del laberinto. */
{
LinkNode *head;/* head pointer*/
}Pila;
int row=0; *El número de filas en el laberinto*/
int line=0; /*El número de columnas en el laberinto*/
void InitStack(Stack *s) /*El la pila está vacía* /
{
s-gt; head =NULL
}
void Push(Pila *s, P p) / *Datos en la pila**
{
LinkNode *LN=(LinkNode *)malloc(sizeof(LinkNode));
LN- gt;pos= p;
LN-gt; siguiente=s-gt;
s-gt;
} p>
P Pop(Stack *s) /* Elimina el elemento superior de la pila**
{
P pos
LinkNode * LN;
p>
LN=s-gt;head;
s-gt;head=s-gt;head-gt;siguiente;
pos=LN-gt;pos ;
eliminar LN;
devolver pos;
}
P GetPop(Pila s ) /* Leer elemento de la pila superior */
{
return s.head-gt
}
int Vacío; (Pila s) /* Juzgar vacío* /
{
if(s.head==NULL)
return
else
return 0;
}
int **InitMaze() /* Devuelve el puntero bidimensional del laberinto**
{
int **laberinto=N
ULL;
int i;
int j;
printf("Ingrese las filas y columnas del laberinto (x, y): ");
scanf("d, d", amp; fila, amp; línea); /* Introduce las filas y columnas del laberinto*/
maze=(int **) malloc( (fila 2)* sizeof(int *));
for(i=0;ilt;fila 2;i)
{
laberinto [i ]=(int *)malloc(sizeof(int)*(line 2));
}
printf("Por favor, ingrese al laberinto\n"); el laberinto, 1 significa barricada, 0 significa pasar*/
for(i=1;ilt;=row;i)
for(j=1;jlt;=line; j)
scanf("d", amp; maze[i][j]);
for( i=0; ilt; line 2; i) /* Pon el números alrededor del laberinto Cambiar todo a 1**
laberinto[0][i]=1
for(i=0; ilt; line 2; i )
laberinto[fila 1][i]=1
for(i=0; ilt.fila 2; i )
laberinto[i][0]= 1;
p>for(i=0;ilt;row 2;i)
laberinto[i][línea 1]=1;
for (i=0;ilt ; fila 2; i ) /* Laberinto de salida*
{
for(j=0; jlt; línea 2; j )
printf("3d ", laberinto[i][j]);
printf("\n");
}
return laberinto;
}
void PrintWay(Stack p) /* ruta de salida**
{
P pos
Pila t; / * Pila temporal utilizada para almacenar la ruta desde la entrada hasta la salida ***
LinkNode *temp
int a, b
InitStack (amp; t);
temp=(LinkNode *)malloc(sizeof(LinkNode));
temp-gt; pos=Pop(amp;p); * Tome la parte superior del elemento de la pila, es decir, "temp".
e., salir */
Push(amp;t,temp-gt.pos /* Ingresar pila**
free(temp);
while(!Empty(p))
{
temp=(LinkNode *)malloc(sizeof(LinkNode));
temp-gt; = Pop(amp;p); /* Obtener el siguiente elemento*/
a=GetPop(t).x-temp-gt;pos.x; 1; Abajo: a=1, b=0**
b=GetPop(t).y-temp-gt; pos.y; : a=-1, b=0; */
if(b==1)
temp-gt; else if(a==1)
temp-gt; pos.way=2;
else if(b==-1)
temp - gt; pos.way=3;
else if(a==-1)
temp-gt; pos.way=4; amp; t, temp-gt; pos); /* nueva posición en la pila*
free(temp); El camino del laberinto es:\n");
printf("Los dos primeros dígitos indican la posición, el último dígito indica la dirección\n");
printf( "1 significa izquierda, 2 significa abajo, 3 significa derecha, 4 significa arriba, 0 significa sin dirección\n");
while(!Empty(t))/* Ruta de salida*/
{
pos=Pop(amp;t);
printf("3d, 3d, 3d\n", pos.x, pos.y, pos. way);
}
}
int FindMaze(int **maze, int r, int l) /* Encuentra la ruta, devuelve 1 si la encuentras , buscar Si no se devuelve 0**
{
Pila p, q; /* Pila p, q representan la ruta y el proceso de exploración del laberinto respectivamente*
P temp1 , temp2;
int a, b.
InitStack(amp; p);
InitStack(amp; q ); p>
temp1.x=1;
temp1.y=1; //
laberinto[1][1]=-1 /* marca aprobada*
Empujar(amp; p, temp1);
Empujar( amp; p, temp1
Empujar(amp; q, temp1); >
mientras(! Vacío(q))
{
temp2=GetPop(q);
if(! (GetPop
(p).x==GetPop(q).x
amp;amp;GetPop(p).y==GetPop(q).y)))
Empujar( amp; p, temp2); /* Si hay un elemento nuevo en la pila, almacene el elemento superior de q en p*/
a= temp2.x; =temp2 .y 1; /* El cuadrado adyacente a la izquierda de la posición actual*/
if(maze[a][b]==0)
{ p>
temp1.x=a;
temp1.y=b;
laberinto[a][b]=-1; / p>
Push(amp; q, temp1);
}
if(a==ramp; amp; b==l) /* Llegar a la salida* *
{
temp1.way=0;
Empujar(amp; p, temp1
Empujar(amp; p); , temp1 );
PrintWay(p);
devuelve 1
}
a=temp2.x
p>b=temp2.y; /* Los cuadrados adyacentes debajo de la posición actual**
if(maze[a][b]==0)
{
temp1.x=a;
temp1.y=b;
laberinto[a][b]=-1; Pasó **
Push(amp; q, temp1
}
if(a==ramp; amp; b==l) /* Llegó a la salida**
{
temp1.way=0;
Push(amp; p, temp1
); PrintWay(p);
devuelve 1
}
a=temp2.x
b= temp2.y-1; ; /* El cuadrado adyacente a la derecha de la posición actual*/
if(maze[a][b]==0)
{
; temp1. x=a;
temp1.y=b;
laberinto[a][b]=-1; > Push(amp; q, temp1);
}
if(a==ramp; amp; b==l) /* Llegar a la salida*/
{
temp1.way=0;
Push(amp; p, temp1);
PrintWay(p); p > return 1;
}
a=temp2.x-1;
b=temp2.y /* La dirección adyacente a la posición actual. Cuadrícula*
if(laberinto[a][b]==0)
{
temp1.x=a;
temp1.y=b;
maze[a][b]=-1; /* Se ha pasado la marca*/
Push(amp; q, temp1); p>
}
if(a==ramp; amp; b==l) /* Llegar a la salida*/
{<
/p>
temp1.way=0;
Push(amp; p, temp1);
PrintWay(p);
}
if(GetPop(p).x==GetPop(q).x
amp;amp;GetPop(p).y== GetPop(q).y) /* Si ninguna de las cuatro direcciones funciona, los datos se devuelven un fotograma de la pila*
{
Pop(amp;p); /p>
Pop(amp; q);
}
}
p> Devolución 0 /* No se pudo explorar el laberinto*/
}
void main()
{
int **maze=InitMaze() /* Inicializa el laberinto*/ p>
if(FindMaze(laberinto, fila, línea))/* Explorar ruta*/
printf("¡Ruta explorada con éxito!\n");
else
printf("¡Error en la exploración de ruta!\n");
getch();