Por favor, ayúdenme con una pregunta sobre programación de estructuras de datos. El tema es el uso de pilas para resolver problemas de laberintos.
Nota: Los siguientes son tres archivos: la definición y declaración de la pila (archivo de encabezado), la implementación de la pila y el problema del laberinto.
/* Representación secuencial de la pila: declaración de función de tipo e interfaz*/
enum { MAXNUM = 20 /* El número máximo de elementos en la pila debe definirse según sea necesario*/
};
typedef int DataType; /* El tipo de elementos en la pila debe definirse según sea necesario*/
struct SeqStack { /* Tipo de pila secuencial definición*/ p>
int t; /* indicación de la posición superior de la pila*/
Tipo de datos s[MAXNUM];
};
typedef struct SeqStack SeqSack, *PSeqStack; /* Tipo de pila secuencial y tipo de puntero*/
/*Crea una pila vacía, solicita espacio para la estructura de la pila y asigna el valor de la variable superior a - 1*/
PSeqStack createEmptyStack_seq( void);
/* Determina si la pila señalada por pastack es una pila vacía. Cuando la pila señalada por pastack es una pila vacía, devuelve 1. , de lo contrario, devuelve 0*/
int isEmptyStack_seq( PSeqStack pastack);
/* Empuja un elemento x en la pila */
void push_seq( PSeqStack pastack , DataType x);
/* Eliminar el elemento superior de la pila*/
void pop_seq( PSeqStack pastack);
/* Cuando la pila apunta por pastack no es una pila vacía, busque la parte superior de la pila Valor del elemento*/
DataType top_seq( PSeqStack pastack);
/* Representación secuencial de la pila: definición de función*/
#include lt; stdio.hgt ;
#include lt;stdlib.hgt;
#include "sstack.h"
/*Cree una pila vacía; solicite espacio para la estructura de la pila y asigne el valor de la variable superior de la pila a -1*/
PSeqStack createEmptyStack_seq( void ) {
PSeqStack pastack = (PSeqStack)malloc(sizeof(struct SeqStack));
if (pastack==NULL)
printf("¡¡Sin espacio!! \n") ;
else
pastack-gt;t = -1;
devolver pastack; /* Determinar si la pila apuntada por pastack es una pila vacía, cuando la pila apuntada por pastack es una pila vacía, devuelve 1; de lo contrario, devuelve 0*/
int isEmptyStack_seq( PSeqStack pastack) {
return pastack-gt; t == -1
}
/* Empujar un elemento x en la pila */
void push_seq (Pastack PSeqStack, tipo de datos x) {
if( pastack-gt; t gt; = MAXNUM - 1 )
printf( "¡Desbordamiento de pila! \n"
else {
pastack- gt;t;
pastack-gt;s[pastack-gt;t] = x;
}
}
/ * Eliminar el elemento superior de la pila*/
void pop_seq( PSeqStack pastack) {
if (pastack-gt; t == -1)
printf( " ¡Desbordamiento inferior!\n" );
else
pastack-gt
}
/* Cuando pastack es Cuando la pila se refiere a no ser una pila vacía, busque el valor del elemento superior de la pila*/
DataType top_seq( PSeqStack pastack) {
return pastack- gt; s[pastack-gt; t ];
}
/* Algoritmo no recursivo para el problema del laberinto (implementación de pila)*/
#define MAXNUM 100/* Número máximo de elementos en la pila */
#define N 11 /*La longitud de la primera dimensión del mapa*/
#include stdio.hgt;
#include lt; stdlib .hgt;
typedef struct {
int x;/* subíndice de fila*/
int y ;/* subíndice de columna*/
int d;/* Dirección de movimiento*/
} DataType;
struct SeqStack { /* Definición de tipo de pila secuencial* /
int t ; /* Indica la posición superior de la pila*/
DataType s[MAXNUM];
};
typedef struct SeqStack *PSeqStack /* Tipo de pila secuencial Tipo de puntero */
PSeqStack pastack /* pastack es una variable de puntero que apunta a la pila de secuencia*/
PSeqStack createEmptyStack_seq( void ) {
PSeqStack pastack;
pastack = (PSeqStack)malloc(sizeof(struct SeqStack));
if (pastack == NULL) p>
printf("¡¡Sin espacio!! \n");
else
pastack-gt; t = -1; pastack;
}
int isEmptyStack_seq( PSeqStack pastack ) {
>
return pastack-gt; t == -1
}
/* Empujar un elemento x en la pila */
void push_seq ( PSeqStack pastack, Tipo de datos x) {
if( pastack-gt;t gt;= MAXNUM - 1)
printf( "Overflow! \n" );
else {
pastack-gt;t;
pastack-gt;s[pastack-gt;t] = x;
}< / p>
}
/* Eliminar el elemento superior de la pila*/
void pop_seq( PSeqStack pastack) {
if (pastack-gt ; t == -1 )
printf( "Underflow!\n"
else
pastack-gt; >
}
/* Cuando la pila a la que apunta pastack no es una pila vacía, encuentre el valor del elemento superior de la pila*/
DataType top_seq( PSeqStack pastack) {
return (pastack-gt; s[pastack-gt; t]);
}
void pushtostack(PSeqStack st, int x, int y, int d) {
elemento tipo de datos;
elemento.x = x;
elemento.y = y; elemento.d = d;
push_seq(st, elemento);
}
void printpath(PSeqStack st) {
Tipo de datos element;
printf("La ruta inversa es:\n"); /* Imprime cada punto de la ruta*/
while(!isEmptyStack_seq(st)) { p>
elemento = top_seq(st);
pop_seq(st);
printf("el nodo es: d d \n", elemento.x, elemento.y );
}
}
/* Encuentra un camino desde el laberinto de entrada[x1][y1] hasta el laberinto de salida[x2][y2] en el laberinto laberinto[M][N] Camino */
/* donde 1lt;=x1,x2lt;=M-2, 1lt;=y1,y2lt;=N-2 */ p>
void mazePath(int laberinto [][N], int dirección[][2], int x1, int y1, int x2, int y2) {
int i, j, k ,
g, h;
PSeqStack st;
elemento de tipo de datos;
st = createEmptyStack_seq(
laberinto[x1][y1); ] = 2; /* Ingresar desde la entrada, marcar */
pushtostack(st, x1, y1, -1 /* Empujar el punto de entrada a la pila*/
while ( !isEmptyStack_seq(st)) { /* Cuando no hay camino por recorrer, retrocede paso a paso*/
element = top_seq(st);
pop_seq( st);
i = elemento.x; j = elemento.y;
for (k = elemento.d 1; k lt; = 3; k) { /* Prueba cada dirección por turno*/
g = i dirección[k][0]; h = j dirección[k][1]
if (g == x2 amp; amp; h == y2 amp ;amp; maze[g][h] == 0) { /* Ir al punto de salida*/
printpath(st /* Imprimir ruta*/
return;
}
if (laberinto[g][h] == 0) { /* Ve a un punto que aún no has caminado* /
laberinto[g ][h] = 2; /* marca*/
pushtostack(st, i, j, k /* empujar a la pila*/); p>
i = g; j = h; k = -1; /* Convertir el siguiente punto al punto actual*/
}
}
}
printf( "No se ha encontrado la ruta.\n");/* No se ha encontrado la ruta después de salir de la pila*/
}
int main(){
int dirección[][2]={0,1,1,0,0,-1,-1,0};
int laberinto[][N] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1,
1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1,
1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1,
1, 0, 0, 0, 1, 0, 1,
1, 0, 1, 1,
1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1,
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};
laberintoPath(laberinto, dirección, 1, 1, 6, 9)
getchar()
devuelve 0;
}