En entradas anteriores he descrito como hacer un generador de sudokus en excel, sin programar. El único problema es que en ambas entradas generamos sudokus ya resueltos, sin las correspondientes celdas en blanco que caracterizan a todo sudoku.
Esta vez, por último, vamos a colocar aleatoriamente las celdas en blanco que todo sudoku debe tener
Generador elemental de Sudokus I
Generador de Sudokus II
He preparado un libro excel que coloca, aleatóriamente, n celdas en blanco, sustituyendo el valor correspondiente por un espacio nulo.
Numero las 81 celdas del sudoku. Numero de izquierda a derecha y de arriba abajo:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 |
- Necesito crear un indice con todas las celdas, con todos los números que indica la dirección de cada celda.
- Por otra parte, para poder localizar un determinado valor, necesito que todos los números que me indica el número de celda tenga el mismo número de dígitos. El truco utilizado es empezar a contar en 10 y terminar en 90. De esta manera todas esas direcciones tienen dos dígitos.
- Ademas, añado o concateno un * antes y otro * después. Si no hacemos esto generamos direcciones adicionales. Si concatenamos 11 y 12 y 13, p.e., 111213 y tomamos los números de 2 en 2 vemos que apare un 21. Si concatenamos *11**12**13* evitamos ese error.
En Aux2:
- La concatenación la hice en un libro auxiliar y luego la copié el valor en Aux2!D2.
- En C2 busco un valor aleatorio entre 0 y 80. Con ese valor busco la dirección de la celda en el indice con =EXTRAE(D2;C2*4+1;4).
- En d3, reemplazo el valor encontrado en el paso anterior por un nulo. Voy repitiendo estos dos pasos hasta la última celda.
- En la columna F paso a valor numérico las claves encontradas con =SUSTITUIR(E2;"*";"")+0 (equivale a =VALOR(SUSTITUIR(E2;"*";"")))
- En G2 indico el numero de celdas en blanco del sudoku. Con ese valor genero en H2 un rango, el rango que contiene las direcciones de las n celdas que aparecerán en blanco.
- Necesito conocer las celdas que aparecerán en blanco, pero con sus direcciones ordenadas.
- Creo el rango con nombre RanBlan (=INDIRECTO(Aux2!$H$2)). Este rango incluye solamente las n primeras direcciones de la columna F, que son las que quedaran en blanco.
- Para cada dirección, la ordenada, en la columna B, cuento el número de veces que aparece en RanBlan, con =CONTAR.SI(RanBlan;$B2). Solo hay dos valores posibles, cero o uno.
- Para pasar los valores del sudoku generado, el que tiene los 81 valores posibles, necesito pasar los valores que hay en la matriz de 9x9 a una matriz de una columna.
- Para trasponer la matriz cálculo la fila y la columna que se corresponde con la dirección de la celda con =ENTERO(($B2-10)/9)+1 para fila y con =RESIDUO(($B2-10);9)+1 para columna. Recordemos el truco de empezar en 10 la numeración de las celdas.
- Utilizo el rango con nombre, ver administrador de nombres, SudoF =Generador!$B$14:$J$22.
- El valor que debe aparecer en el sudoku final, para cada dirección, es =SI(I2=1;"";INDICE(SudoF;$J2;$K2))
- Ya tengo los valores en una matriz de una columna, queda trasponer esa columna a una matriz de 9*9. En Aux2!o3:w11 paso las direcciones de columna a matriz con =$N3*9+O$2.
- En o14:w22 paso los valores de columna a matriz 9*9 con =INDICE($L$2:$L$82;O3)
- Este método no garantiza que la quinta regla del sudoku se cumpla, puede que al final de todo este proceso la solución no sea única. Cuantos mas espacios en blanco haya mas probable es que no nos salga un sudoku de solución única.
En la portada, hoja Generador:
- Sitúo una barra de desplazamiento con la que se puede modificar el número de celdas en blanco, vinculada con la celda Aux2!$G$2. Limitada entre 20 y 60 blancos. Lógicamente estos límites se pueden cambiar a gusto del usuario.
- El sudoku final queda en el rango m14:u22. Paso los valores de la hoja Aux2 a la principal con =Aux2!O14.
- En la primera columna tenemos el valor A, en la segunda columna y en la misma fila tenemos un valor B. En otra fila, en otra región, tenemos en la primera columna un valor B y en la segunda un valor A.
- Si intercambiamos A por B y B por A:
- Tanto la primera columna como la segunda columna mantienen A y B, sin repetirse ni en la columna ni en las filas afectadas.
- Las dos filas afectadas mantienen A y B sin repetirse sin afectar ni a las columnas ni a las regiones.
- En estos casos no se puede tapar con un espacio los cuatro valores (2 A y 2 B).