shakaran, realmente me gustaría ayudarte, pero es extenso el meterse en lo que estas haciendo, necesitaría bajarme el script e ir viéndolo...igual estoy seguro que estas cerca!
Me tomo 5 min para dejarles los comentarios de mi script. Realmente son dos funciones, una llamada validarPosicion, y la otra llamada recorrerLaberinto. Después esta la función queso que fue otorgada en el desafió, y la función dibujarLaberinto que no tiene mucho que explicar, simplemente recorre el array y mete una imagen por cada posición.
Código Código PHP:
<?
/*
validarPosicion:
Datos de entrada:
$fila Int
$columna Int
Datos de salida:
Boolean
*/
function validarPosicion( $fila, $columna ){
#Declaro globales variables
global $laberinto, $filas, $columnas, $pared, $libre, $visitada;
#Me fijo si las posiciones están dentro del array
if( $fila < 0 || $fila >= $filas || $columna < 0 || $columna >= $columnas ) return false;
#Ahora veo si las posiciones han sido visitadas o si es pared
if( $laberinto[$fila][$columna] == $visitada || $laberinto[$fila][$columna] == $pared ) return false;
#Si no se hizo un return false llegará acá y dará true
return true;
}
/*
recorrerLaberinto:
Datos de entrada:
$fila Int
$columna Int
Datos de salida:
Boolean
*/
function recorrerLaberinto( $fila, $columna ){
#Declaro globales variables
global $laberinto, $filas, $columnas, $pared, $libre, $queso, $visitada, $encontroQueso;
#Veo que la posición que estoy viendo no sea $queso, de ser así pongo $encontroQueso en true, lo cual cortará la recursividad, y marcaré dicha posición como $queso.
if( $laberinto[$fila][$columna] == $queso ){
$encontroQueso = true;
$laberinto[$fila][$columna] = $queso;
}else{
#Sino, simplemente la marco como que ya ha sido visitada
$laberinto[$fila][$columna] = $visitada;
}
#Ahora, lo que haré es ver que $encontroQueso sea false, y que la posición que recorreré (abajo, derecha, izquierda, arriba) sea valida mediante validarPosicion.
#Si es una posición que puedo recorrer hago recursividad, sino pasará a ver si puede recorrer en la siguiente posición. En caso de pasar los 4 if, dará true como salida y cortara el script.
if( $encontroQueso === false && validarPosicion( ( $fila + 1 ), $columna ) === true ) $encontroQueso = recorrerLaberinto( ( $fila + 1 ), $columna ); #Abajo
if( $encontroQueso === false && validarPosicion( $fila, ( $columna + 1 ) ) === true ) $encontroQueso = recorrerLaberinto( $fila, ( $columna + 1 ) ); #Derecha
if( $encontroQueso === false && validarPosicion( $fila, ( $columna - 1 ) ) === true ) $encontroQueso = recorrerLaberinto( $fila, ( $columna - 1 ) ); #Izquierda
if( $encontroQueso === false && validarPosicion( ( $fila - 1 ), $columna ) === true ) $encontroQueso = recorrerLaberinto( ( $fila - 1 ), $columna ); #Arriba
return $encontroQueso;
}
#Ejecución:
#Un titulo
echo "<h1>Original</h1>";
#Pongo el queso
queso( $laberinto );
#Dibujo el laberinto original
dibujarLaberinto();
#Ejecuto recorrerLaberinto en una posición fija y veo que me de true, en caso contrario no habrá encontrado solución
$ok = recorrerLaberinto( 1, 1 );
#Y por no encontrarla corto y muestro un mensaje
if( $ok === false ) die( "<hr>Laberinto sin solución<hr>" );
#Sino, un título más
echo "<h1>Resuelto</h1>";
#Y redibujo el array que se ha reescrito en el proceso mostrando la solución
dibujarLaberinto();
?>