Red de conocimiento informático - Aprendizaje de código fuente - Problema del laberinto de estructura de datos

Problema del laberinto de estructura de datos

#include lt; stdio.hgt;

#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 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

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)

{

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*/

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();