Ver Mensaje Individual
  #11 (permalink)  
Antiguo 27/01/2010, 08:52
Avatar de dggluz
dggluz
 
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 525
Antigüedad: 15 años
Puntos: 50
Respuesta: [APORTE] Generador de sudokus sencillo y explicado

Nuevo error en el script, pero esta vez fue error de implementación. Ahora sí que tengo la certeza de que funciona bien, pero ya no genera sudokus muy difíciles. Intenta generar con la dificultad que se le indica, pero va sacando sólo los números de los casilleros que puede sin perder la solución única, y a veces da toda la vuelta y no puede sacar muchos números. A continuación, las funciones corregidas:
Código PHP:
    function borrarCasilleros($sudokuOriginal$dificultad=NULL)
    {
        if(
$dificultad==NULL)
        {
            
srand(ceil(999999999*microtime()));
            
$dificultad=rand(128);
        }
        
$arrPosiciones=array(123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081);
        
$arrOrden=$arrPosiciones;
        
shuffle2($arrOrden);
        
$quitados=0;
        
$sudokuResultante=$sudokuOriginal;
        
$limite=$dificultad+35;
        
$i=1;
        while(
$quitados<$limite && $i<81)
        {
            
$sudokuAnt=$sudokuResultante;
            
$quitadosAnt=$quitados;
            
$idx=$arrOrden[$i];
            
$sudokuResultante[$idx]=NULL;
            if(!
solucionUnica($sudokuResultante$quitados$idx))
            {
                
$quitados=$quitadosAnt;
                
$sudokuResultante=$sudokuAnt;
            }
            
$i++;
        }
        
$dificultad=$quitados-35;
        echo 
"<br />Dificultad: $dificultad<br />";
        return 
$sudokuResultante;
    }
    
    function 
solucionUnica($sudoku, &$quitados$idx)
    {
        
$original=array(123456789);
        
$cols=array(1=>12=>23=>34=>45=>56=>67=>78=>80=>9);
        
$cuadrado=array(
             
1=>'A',  2=>'A',  3=>'A',  4=>'B',  5=>'B',  6=>'B',  7=>'C',  8=>'C',  9=>'C'
            
10=>'A'11=>'A'12=>'A'13=>'B'14=>'B'15=>'B'16=>'C'17=>'C'18=>'C'
            
19=>'A'20=>'A'21=>'A'22=>'B'23=>'B'24=>'B'25=>'C'26=>'C'27=>'C'
            
28=>'D'29=>'D'30=>'D'31=>'E'32=>'E'33=>'E'34=>'F'35=>'F'36=>'F'
            
37=>'D'38=>'D'39=>'D'40=>'E'41=>'E'42=>'E'43=>'F'44=>'F'45=>'F'
            
46=>'D'47=>'D'48=>'D'49=>'E'50=>'E'51=>'E'52=>'F'53=>'F'54=>'F'
            
55=>'G'56=>'G'57=>'G'58=>'H'59=>'H'60=>'H'61=>'I'62=>'I'63=>'I'
            
64=>'G'65=>'G'66=>'G'67=>'H'68=>'H'69=>'H'70=>'I'71=>'I'72=>'I'
            
73=>'G'74=>'G'75=>'G'76=>'H'77=>'H'78=>'H'79=>'I'80=>'I'81=>'I');
        
$cuadrados=array(
            
'A'=>array(123101112192021),
            
'B'=>array(456131415222324),
            
'C'=>array(789161718252627),
            
'D'=>array(282930373839464748),
            
'E'=>array(313233404142495051),
            
'F'=>array(343536434445525354),
            
'G'=>array(555657646566737475),
            
'H'=>array(585960676869767778),
            
'I'=>array(616263707172798081)
        );
    
        
$idxColumna=$cols[$idx&#37;9];
        
$idxFila=ceil($idx/9);
        
$idxCuadrado=$cuadrado[$idx];
        
        
$idxsColumna=array();
        
$idxsFila=array();
        for(
$j=1$j<=9$j++)
        {
            
array_push($idxsColumna, ($idxColumna+9*($j-1)));
            
array_push($idxsFila, ($j+($idxFila-1)*9));
        }
        
$idxsCuadrado=$cuadrados[$idxCuadrado];
        
        
$columna=obtenerPorcion($sudoku$idxsColumna);
        
$fila=obtenerPorcion($sudoku$idxsFila);
        
$cuadro=obtenerPorcion($sudoku$idxsCuadrado);
        
        
$opciones=array_diff($original$columna$fila$cuadro);
        if(
count($opciones)==0)
        {
            echo 
"ERROR.";
        }
        elseif(
count($opciones)==1)
        {
            
$quitados++;
            return 
true;
        }
        else
        {
            return 
false;
        }
    } 
Disculpen las molestias (de andar cambiando tantas veces el código ). ¡Suerte!