Programa en c++

Saludo amigo tengo un problema de desbordamiento estoy trabajando con visual c++ te agrego el programa necesito saber cual es la falla. Gracias
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define F 10
#define C 10
int push(int pila[][2], int fil, int col); //Colocar un elemento en la pila
int pop(int pila[][2], int *fil, int *col); //Sacar un elemento de la pila
int esta_llena(int pila[][2]); //Determina si la pila esta llena
int esta_vacia(int pila[][2]); //Determina si la pila esta vacia
void limpiar_pila(int pila[][2]); //Inicializar la pila con ceros (limpiar)
void buscar_camino(int laberinto[F][C], int inif, int inic, int pila[][2]); //Funcion que inicia la busqueda dentro del laberinto
int top= -1; // Variable para mantener el tope de la pila, inicia en -1
// para indicar que la pila esta vacia
void main (void){
int matriz[F][C]; // Matriz de datos (Laberinto)
int camino[F*C][2]; //matriz de caminos
int fil, col; // variables para recorrer la matriz
int inifil=0, inicol=0; // Fila y columna inicial para la busqueda dentro del laberinto
srand(time(NULL)); //Activar la semilla de aleatorios
for (fil=0; fil < F; fil++)
for (col=0; col < C; col++)
matriz[fil][col] = rand()%2;
for (fil=0; fil < F; fil++){
for (col=0; col < C; col++)
printf("%4d",matriz[fil][col]);
printf("\n"); //Salto de linea
}
//Generar El fin del laberinto, marcado con el numero 2
fil = rand()%F; //Aleatorio para la fila
col = rand()%C; //Aleatorio para la columna
matriz[fil][col] = 2;
// Limpiar la pila para iniciar el juego
limpiar_pila(camino);
printf("\nIngrese la fila inicial >>:");
scanf("%d", &inifil);
printf("\nIngrese la columna inicial >>:");
scanf("%d", &inicol);
// Iniciar la busqueda dentro del laberinto comenzando por la posicion 0,0
buscar_camino(matriz, inifil, inicol, camino);
}
//Colocar un elemento en la pila
//y retorna el nuevo tope de la pila
int push(int pila[][2], int fil, int col){
if (esta_llena(pila))
return -1;
top++; //Incrementa el tope de la pila
pila[top][0] = fil; //Guarda la fila en la pila
pila[top][1] = col; //Guarda la columna en la pila
return top;
}
//Sacar un elemento de la pila
//y retorna el nuevo tope de la pila
int pop(int pila[][2], int *fil, int *col){
if (!esta_vacia(pila)){
*fil = pila[top][0];
*col = pila[top][1];
pila[top][0] = 0;
pila[top][1] = 0;
top--; //Disminuye el tope de la pila
}
return top; //Si la pila esta vacia, entonces retornara (-1)
}
int esta_llena(int pila[][2]){
if (top >= (F-1))
return 0; //Verdadero La pila esta llena
else
return 1; //False aun no se ha llenado la pila
}
//Determina si la pila esta vacia
int esta_vacia(int pila[][2]){
if (top < 0)
return 0;
else
return 1;
}
//Inicializar la pila con ceros (limpiar)
void limpiar_pila(int pila[][2]){
int fil, num_elementos;
num_elementos = sizeof(pila)/sizeof(pila[0][0]);
num_elementos = num_elementos / 2; //Debido a que son dos columnas y
//obtengo el numero de filas
for (fil = 0; fil < num_elementos; fil++){
pila[fil][0] = 0;
pila[fil][1] = 0;
}
}
//Funcion que inicia la busqueda dentro del laberinto
void buscar_camino(int laberinto[F][C], int inif, int inic, int pila[][2]){
int f,c;
int avanzar = 1; //Bandera para saber si puede avanzar
f = inif; //Guardar la posicion inicial
c = inic; //Guardar la posicion inicial
//Verificar si ha llegado al final
while (laberinto[f][c] != 2){
printf("\nFila >>%d", f);
printf("\nColumna >>%d", c);
//Preguntar si puede avanzar
if (laberinto[f][c] == 0){
printf("\nPUSH");
//Guardar la posicion inicial del camino en la pila
push(pila, f, c);
//Marcar el elmento de la matriz como una pared (UNO)
laberinto[f][c] = 1;
}
//Avanzar hacia la derecha
if(c < (C - 1) && (laberinto[f][c+1] == 0) ){
c++;
avanzar = 0; //Pudo avanzar
}
else if ( c > 0 && (laberinto[f][c--] == 0) ){
//Avanzar hacia la izquierda
c--;
avanzar = 0; //Pudo avanzar
}
else if(f < (F-1) && (laberinto[f++][c] == 0) ){
//Avanzar hacia abajo
f++;
avanzar = 0; //Pudo avanzar
}
else if(f > 0 && (laberinto[f--][c] == 0) ){
//Avanzar hacia arriba
f--;
avanzar = 0; //Pudo avanzar
}
else
avanzar = 1; //No puede avanzar
printf("\nFila >>%d", f);
printf("\nColumna >>%d", c);
if(avanzar == 1){
//Se ha topado con una pared,
//Por lo tanto debe regresar al punto anterior,
//para ello saca de la pila el ultimo elemento ingresado
if (esta_vacia(pila))
break; //Termina el lazo, porque no puede sacar de la pila
else
pop(pila, &f,&c);
printf("\nPOP");
//Ahora f y c contienen la ultima posicion valida
}
}
if(laberinto[f][c] == 2)
printf("\nHas llegado al final, felicitaciones");
return;
}

1 Respuesta

Respuesta
1
me parece que en la función buscar camino en este while
while (laberinto[f][c] != 2) {
printf("\nFila >>%d", f);
printf("\nColumna >>%d", c);
Debes de comprobar antes de moverte arriba o abajo que la posición [f][c] sea válida, ya que si estoy en la posición [0][0] y me dice vete arriba entonces se va a [0][-1] lo cual es un desbordamiento.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas