Código PHP:
<?php
function ocho_reinas($pos, $solucion, $diagonal_desc, $diagonal_asc) {
if($pos > 7){ //Validación para saber si ha terminado de recorrer todas las posibles soluciones.
echo "{";
foreach($solucion as $i =>$j ){ //Recorre el Array de soluciones para mostrarlas.
echo "".$j.",";
if($i==7){
echo "}";
echo "<br>";
}
}
}
else {
for ($i = 0; $i < 8; $i++) { //Recorremos las filas
if(!in_array($i, $solucion) AND !in_array(($pos+$i), $diagonal_asc) AND !in_array(($pos-$i), $diagonal_desc) ) {
//Entra , si esa casilla no está amenazada!
$diagonal_asc[$pos] = $pos+$i; //diagonal ascendente.
$diagonal_desc[$pos] = $pos-$i; //diagonal descendente.
$solucion[$pos] = $i; //Se guarda una posición valida.
ocho_reinas($pos+1, $solucion, $diagonal_desc, $diagonal_asc);
}
}
}
$pos = 0; //Posicion inicial
$solucion = Array();//posibles soluciones.
$diagonal_desc = Array();//diagonales descendentes
$diagonal_asc = Array();//diagonales ascendentes .
ocho_reinas($pos, $solucion, $diagonal_desc, $diagonal_asc);//Se llama al metodo de la lógica de las reinas.
?>
He hecho la prueba de escritorio
los datos que arroja son los mismos hasta cierto punto comparandolos con los que muestra la ejecucion del algoritmo...(filas-->valores, Columnas--> indices del array)
- Tengo una duda, como funciona el la parte recursiva del lagortmo?, es decir c por ejemplo cuando la i del for va en 1 y se cumple la condicion if(!in_array($i, $solucion)....), al llamar mi metodo recursivamente, el for continua con su ietraccion normalmente? es decir sigue con i =2, i=3... y asi sucesivante, o vuelve a iniciar en 0???
espero que me puedan ayudar...
Gracias...
Algortimo http://squadronsuicida.99k.org/Reinas/Reinas.php.
Descarga http://squadronsuicida.99k.org/Reinas/Reinas.txt
Prueba http://squadronsuicida.99k.org/Reinas/Reinas_Prueba.php.
Descarga http://squadronsuicida.99k.org/Reinas/Reinas_Prueba.txt