Reto 2. Sudoku Killer
|
TDA Tablero Representa al sudoku en sí; es decir, al tablero 9x9 con las casillas y los grupos. Más...
#include <Tablero.h>
Métodos públicos | |
Tablero () | |
Constructor sin argumentos. | |
Tablero (const vector< Grupo > &grupos, const vector< vector< Casilla >> &sdk) | |
Constructor con vector de grupos y vector de vectores de casillas. Más... | |
const Grupo & | get_grupo (int pos) const |
Devuelve el grupo correspondiente a la posición de este en el vector sudoku . Más... | |
void | set_casilla (const Casilla &casilla_escrita, bool limpiar=true) |
Modifica el grupo de la casilla que escribe eliminándola de este, con el metodo quitar_casilla (Casilla cas) de la clase Grupo y modifica el sudoku colocando el valor a la casilla correspondiente. Más... | |
void | escribir_vector (const vector< Casilla > &a_escribir) |
Escribe un vector de casillas en el tablero. Llama a Tablero::set_casilla() Más... | |
void | escribir_inmediatos () |
Escribe las casillas inmediatas obtenidas: Más... | |
void | calcular_todas_combinaciones () |
Rellena todas las combinaciones posibles (cada una con todas sus posiciones). LLama a calcular combinaciones de cada grupo de la clase Grupo. | |
void | limpiar (const Casilla &cas) |
Actualiza el tablero. LLama a: Más... | |
void | escribir_determinados () |
Itera sobre cada grupo llamando a escribe_determinados() | |
Métodos privados | |
Grupo & | get_grupo (const Casilla &cas) const |
Devuelve el grupo al que esta casilla pertenece. Más... | |
vector< Grupo > | getGrupos_fila (const Casilla &fila) const |
Devuelve un vector de los grupos que tienen al menos una casilla en esa fila. Más... | |
vector< Grupo > | getGrupos_col (const Casilla &col) const |
Devuelve un vector de los grupos que tienen al menos una casilla en esa columna. Más... | |
vector< Grupo > | getGrupos_cubo (const Casilla &cubo) const |
Devuelve un vector de los grupos que tienen al menos una casilla en ese cubo. Más... | |
void | rellenar_unitarias () |
Rellena los grupos que tienen una sola casilla. Más... | |
void | metodo_45 () |
Escribe las casillas determinadas por el método del 45 (o derivados inmediatos). Más... | |
const Casilla & | unico_casillas_fuera_fil (const Casilla &fila, int desp=0) const |
Devuelve la casilla que se puede calcular (única fuera o única dentro). Devuelve casilla nula si no existe una única fuera o dentro de la estructura. Más... | |
const Casilla & | unico_casillas_fuera_col (const Casilla &col, int desp=0) const |
Devuelve la casilla que se puede calcular (única fuera o única dentro). Devuelve casilla nula si no existe una única fuera o dentro de la estructura. Más... | |
const Casilla & | unico_casillas_fuera_cubo (Casilla cubo, bool desp_dcha=false, bool desp_abj=false) const |
Devuelve la casilla que se puede calcular (única fuera o única dentro). Devuelve casilla nula si no existe una única fuera o dentro de la estructura. Más... | |
void | limpiar_basico (const Casilla &cas) |
Dada la última casilla escrita en el tablero, limpia todas las combinaciones y posiciones de cada estructura que contenga a cas. Más... | |
void | limpiar_fila (const Casilla &cas) |
Dada la última casilla escrita en el tablero (o simulada), itera sobre todos los grupos con casillas dentro de la fila a la que cas pertenece. Más... | |
void | limpiar_col (const Casilla &cas) |
Dada la última casilla escrita (o simulada) en el tablero, itera sobre todos los grupos con casillas dentro de la col a la que cas pertenece. Más... | |
void | limpiar_cubo (const Casilla &cas) |
Dada la última casilla escrita (o simulada) en el tablero, itera sobre todos los grupos con casillas dentro del cubo al que cas pertenece. Más... | |
void | limpiar_unic_comb (const Casilla &cas) |
Sobre cada uno de los grupos tocados por las estructuras a las que cas pertenece se comprobará: Más... | |
Atributos privados | |
vector< Grupo > | grupos |
Vector de los grupos que quedan en el sudoku. Más... | |
vector< vector< Casilla > > | sudoku |
Matriz de Casillas que representan el tablero del sudoku en sí. | |
TDA Tablero Representa al sudoku en sí; es decir, al tablero 9x9 con las casillas y los grupos.
Una instancia tab del tipo de dato abstracto Tablero
es una matriz 9x9 con casillas que identifican las distintas estructuras, es decir, a las filas, columnas y cubo. Esto es de vital importancia, pues tomaremos en muchas ocasiones el nombre estructura para identificar estos tres términos, ya que en ninguno de ellos se podrán repetir casillas con mismo valor
.
Lo representaremos como un vector de grupos, que a su vez identifica todas las casillas que tiene el Tablero del Sudoku Killer.
Constructor con vector de grupos y vector de vectores de casillas.
grupos | Vector de grupos del tablero |
sdk | Tabla de casillas del tablero |
void Tablero::escribir_inmediatos | ( | ) |
Escribe las casillas inmediatas obtenidas:
void Tablero::escribir_vector | ( | const vector< Casilla > & | a_escribir | ) |
Escribe un vector de casillas en el tablero. Llama a Tablero::set_casilla()
a_escribir | Vector de casillas a escribir en el sudoku. |
Devuelve el grupo al que esta casilla pertenece.
cas | Casilla cuyo grupo se devuelve |
const Grupo& Tablero::get_grupo | ( | int | pos | ) | const |
Devuelve el grupo correspondiente a la posición de este en el vector sudoku
.
pos | Posición del grupo que se quiere tener |
pos
Devuelve un vector de los grupos que tienen al menos una casilla en esa columna.
col | Columna del sudoku en la que buscar grupos |
Devuelve un vector de los grupos que tienen al menos una casilla en ese cubo.
cubo | Cubo del sudoku en el que buscar grupos |
Devuelve un vector de los grupos que tienen al menos una casilla en esa fila.
fila | Fila del sudoku en la que buscar grupos |
void Tablero::limpiar | ( | const Casilla & | cas | ) |
Actualiza el tablero. LLama a:
cas | Casilla cuyo valor se limpiará |
|
private |
Dada la última casilla escrita en el tablero, limpia todas las combinaciones y posiciones de cada estructura que contenga a cas.
LLama a Tablero::limp_{estructura}(Casilla cas)
cas | Última casilla escrita |
|
private |
Dada la última casilla escrita (o simulada) en el tablero, itera sobre todos los grupos con casillas dentro de la col a la que cas pertenece.
Esto se da porque la manera de limpiar un grupo de imposibilidades es notablemente distinta en los casos en los que los grupos afectados estén o no enteramente contenidos dentro de la estructura afectada
cas | última casilla escrita (o simulada) |
|
private |
Dada la última casilla escrita (o simulada) en el tablero, itera sobre todos los grupos con casillas dentro del cubo al que cas pertenece.
Esto se da porque la manera de limpiar un grupo de imposibilidades es notablemente distinta en los casos en los que los grupos afectados estén o no enteramente contenidos dentro de la estructura afectada
cas | última casilla escrita (o simulada) |
|
private |
Dada la última casilla escrita en el tablero (o simulada), itera sobre todos los grupos con casillas dentro de la fila a la que cas pertenece.
Esto se da porque la manera de limpiar un grupo de imposibilidades es notablemente distinta en los casos en los que los grupos afectados estén o no enteramente contenidos dentro de la estructura afectada
cas | última casilla escrita (o simulada) |
|
private |
Sobre cada uno de los grupos tocados por las estructuras a las que cas pertenece se comprobará:
La motivación de este uso del método reside en que si en cierta estructura encontramos un grupo con una única combinación, aunque no sepamos el orden en el que esta aparecerá (su posición) y por tanto no podamos escribirla, sabemos que todos esos dígitos aparecerán en las casillas asociadas al grupo, y por tanto no aparecerán en ninguna otra casilla de la estructura que lo contenga Por tanto, llamamos a limpiar_{estructura} con una casilla simulada
cas | Úlima casilla escrita |
|
private |
Escribe las casillas determinadas por el método del 45 (o derivados inmediatos).
MÉTODO DE LOS 45
Iterando sobre cada una de las estructuras del tablero (todas las filas, columnas y cubos de 3x3) examinamos si todos los grupos con casillas en esa estructura están totalmente contenidos menos uno de ellos. En ese caso, si el grupo no-enteramente-contenido tiene fuera de la estructura 1 sola casilla, o size_grupo-1 casillas, podremos determinar de manera inmediata una casilla del grupo. (Tablero::unico_casillas_fuera_{estructura})
Nótese que el método es fácilmente aplicable al caso en el que tengamos una estructura compuesta de dos o más de las estructuras anteriormente consideradas (sea n) usando 45*n en las fórmulas.
Obtiene un vector con las casillas a escribir y las escribe con Tablero::escribir_vector.
|
private |
Rellena los grupos que tienen una sola casilla.
Las guarda en un vector y las escribe con Tablero::escribir_vector()
void Tablero::set_casilla | ( | const Casilla & | casilla_escrita, |
bool | limpiar = true |
||
) |
Modifica el grupo de la casilla que escribe eliminándola de este, con el metodo quitar_casilla (Casilla cas) de la clase Grupo y modifica el sudoku colocando el valor a la casilla correspondiente.
Además, llamará a limpiar (por defecto) para quitar las combinaciones posibles de otros grupos.
casilla_escrita | Casilla cuyo valor se escribe |
limpiar | Por defecto limpia. En el caso que no queramos, pasar un booleano igual a false. |
|
private |
Devuelve la casilla que se puede calcular (única fuera o única dentro). Devuelve casilla nula si no existe una única fuera o dentro de la estructura.
col | Casilla de la cual solo tomaremos la segunda coordenada |
desp | Número de columnas que hemos utilizado en el método 45. ( |
|
private |
Devuelve la casilla que se puede calcular (única fuera o única dentro). Devuelve casilla nula si no existe una única fuera o dentro de la estructura.
cubo | Casilla que utilizaremos para identificar el cubo |
desp_dcha | Predeterminado false, ya que solo en el caso de querer tomar dos grupos hacia la derecha la llamaremos con booleano igual a true. ( |
desp_abj | Predeterminado false, ya que solo en el caso de querer tomar dos grupos hacia abajo la llamaremos con booleano igual a true. ( |
|
private |
Devuelve la casilla que se puede calcular (única fuera o única dentro). Devuelve casilla nula si no existe una única fuera o dentro de la estructura.
fila | Casilla de la cual solo tomaremos la primera coordenada |
desp | Número de filas que hemos utilizado en el método 45 ( |
|
private |
Vector de los grupos que quedan en el sudoku.
Inicialmente, abarca el tablero completo.