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

Edito: este script tiene un error de implementación, está en la respuesta 11 corregido
------------------
Creo haber descubierto la forma de arreglar el error que describo: la función solucionUnica debe comprobar que el último casillero en vaciarse tenga solución única, no que lo tengan los demás. De este modo, en el orden exactamente inverso que como se van sacando los casilleros, puede resolverse el sudoku, siempre completando los casilleros con soluciones únicas, lo que garantiza que el sudoku entero tiene solución única. La nueva implementación de la función es ésta:
Código PHP:
#'%'
    
function solucionUnica($sudoku, &$posibles$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%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);
        
        
$posibles[$idx]=array_diff($original$columna$fila$cuadro);
        if(
count($posibles[$idx])==0)
        {
            echo 
"ERROR.";
        }
        elseif(
count($posibles[$idx])==1)
        {
            return 
true;
        }
        return 
true;
    } 
Espero que ahora sí funcione bien. ¡Suerte!

Última edición por dggluz; 27/01/2010 a las 08:52