El ejercicio consiste en hacer un programa en C que sea capaz de resolver un laberinto simple, un camino, que se le ha de pasar al programa por la entrada de texto. El laberinto tiene que ser de 32x32 caracteres binarios, siendo los 0s los espacios vacíos.
Y ha de guardarse en un array bidimend¡sional para trabajar con él.
Tal que así:
Código:
11111011111111111111111111111111
11111011111111111111111111111111
11111011111111111111111111111111
11111011111111111111111111111111
11111011111111111111111111111111
11111000000000000000000111111111
11111111111111111111110111111111
11111111111111111111110111111111
11111111111111111111110111111111
11111111111111111111110111111111
11111111111111111111110111111111
11111111111111111111110111111111
11111100000000000000000111111111
11111101111111111111111111111111
11111101111111111111111111111111
11111101111111111111111111111111
11111101111111111111111111111111
11111101111111111111111111111111
11111101111111111111111111111111
11111101111111111111111111111111
11111100000000000000000000000011
11111111111111111111111111111011
11111111111111111111111111111011
11111111111111111111111111111011
11100000000000000000000000000011
11101111111111111111111111111111
11101111111111111111111111111111
11101111111111111111111111111111
11101111111111111111111111111111
11101111111111111111111111111111
11100000000000000000000000011111
11111111111111111111111111011111
Y la salida del programa ha de darte los movimientos que ha seguido el programa para completar el laberinto. También he hecho que imprima las coordenadas de la posición actual en cada movimiento.
El problema viene cuando al pasarle el laberinto, el programa avanza solo unas pocas posiciones o entra en un bucle. Dando salidas como estas:
Posicion inicial 0x0(ni un avance)
Código:
Array guardado
Mi posicion inicial: 0 x 0
Posicion inicial 3x5 (avanza varias y luego se para)
Código:
Array guardado
Mi posicion inicial: 3 x 5
Down Mi posicion: 4 x 5
Down Mi posicion: 5 x 5
Right Mi posicion: 5 x 6
Right Mi posicion: 5 x 7
Posicion 5x22 (Idem)
Código:
Array guardado
Mi posicion inicial: 5 x 22
Down Mi posicion: 6 x 22
Down Mi posicion: 7 x 22
Posicion 5x9 (Entra en bucle)
Código:
Array guardado
Mi posicion inicial: 5 x 9
Right Mi posicion: 5 x 10
Right Mi posicion: 5 x 11
Left Mi posicion: 5 x 10
Right Mi posicion: 5 x 11
Left Mi posicion: 5 x 10
Right Mi posicion: 5 x 11
Left Mi posicion: 5 x 10
Right Mi posicion: 5 x 11
Left Mi posicion: 5 x 10
Right Mi posicion: 5 x 11
Evidentemente algo en la lógica o en el algoritmo esta mal, pero no consigo encontrar el fallo.
Este es mi código:
Código
#include<stdio.h> main() { int position_fila; int position_columna; int ultima_pos_fila, ultima_pos_col; int sig_fila, sig_columna, ant_fila, ant_columna; int laberinto[32][32]; int v,t,c,i,x,j, nc; nc = 0; position_fila = 0; position_columna = 0; sig_fila = position_fila + 1; sig_columna = position_columna + 1; ant_fila = position_fila - 1; ant_columna = position_columna - 1; ultima_pos_fila = ultima_pos_col = 0; v = 1; nc = 0; for(i=0;i<32;i++) { for(j=0;j<32;j++) { laberinto[i][j] = 0; } } //Guardar entrada en array bidimensional "laberinto" for(i=0;i<32;i++) { for(j=0;j<32;j++) { switch(c) { case '1': { laberinto[i][j] = 1; break; } case '0': { laberinto[i][j] = 0; break; } case '\n': { j = j - 2; break; } default: break; } } } //Imprimir laberinto for(i=0;i<32;i++) { for(j=0;j<32;j++) { ++nc; if(!(nc%32)) } } //Averiguar posicion inicial for(t = 0; t < 32; t++) { v = laberinto[0][t]; if(v == 0) { position_columna = t; break; } } //Resolucion for(x = 0; x < 50;x++) { // 2 Condiciones: //[1] Si puedo moverme hacia abajo (Si el elemento bajo mi posicion es 0). //[2] Que no haya estado antes en esa posicion (si mi ultima posicion no es igual a la siguiente). if((!(laberinto[sig_fila][position_columna])) && (sig_fila != ultima_pos_fila)) { ultima_pos_fila = position_fila; //Guardas ultima posicion ++position_fila; //Mueves hacia abajo } // 2 Condiciones: //[1] Si puedo moverme hacia la derecha (Si el elemento a la derecha mi posicion es 0). //[2] Que no haya estado antes en esa posicion (si mi ultima posicion no es igual a la siguiente). else if((!(laberinto[position_fila][sig_columna])) && (sig_columna != ultima_pos_col)) { ultima_pos_col = position_columna; //Guardas ultima posicion position_columna++; //Mueves hacia la derecha } // 2 Condiciones: //[1] Si puedo moverme hacia arriba (Si el elemento sobre mi posicion es 0). //[2] Que no haya estado antes en esa posicion (si mi ultima posicion no es igual a la siguiente). else if((!(laberinto[ant_fila][position_columna])) && (ant_fila != ultima_pos_fila)) { ultima_pos_fila = position_fila; //Guardas ultima posicion position_fila--; //Mueves hacia arriba } // 2 Condiciones: //[1] Si puedo moverme hacia la izquierda (Si el elemento a la izquierda mi posicion es 0). //[2] Que no haya estado antes en esa posicion (si mi ultima posicion no es igual a la siguiente). else if((!(laberinto[position_fila][ant_columna])) && (ant_columna != ultima_pos_col)) { ultima_pos_col = position_columna; //Guardas ultima posicion position_columna--; //Mueves hacia izquierda } } }
Muchas gracias de antemano por cualquier ayuda y un saludo a la comunidad elhacker!