Reto 2. Sudoku Killer
|
TDA Grupo Representa los conjuntos contiguos de celdas marcados con línea discontinua en un Sudoku Killer. Más...
#include <Grupo.h>
Métodos públicos | |
const vector< Casilla > & | getCasillas () const |
Recupera las casillas de grupo. Más... | |
int | getSuma () const |
Recupera la suma asociada al grupo. Más... | |
const vector< vector< vector< int > > > & | getCombinaciones () const |
Recupera las combinaciones posibles del grupo (basadas en el instante del tablero) Más... | |
void | setCasillas (const vector< Casilla > &cas) |
Fija las casillas de grupo. Más... | |
void | setSuma (int sum) |
Fija la suma asociada al grupo. Más... | |
void | setCombinaciones (const vector< vector< vector< int >>> &comb) |
Fija las combinaciones posibles del grupo (basadas en el instante del tablero) Más... | |
bool | InFila () const |
Informa sobre si el grupo está enteramente contenido en una fila. Más... | |
bool | InCubo () const |
Informa sobre si el grupo está enteramente contenido en un cubo. Más... | |
bool | InCol () const |
Informa sobre si el grupo está enteramente contenido en una columna. Más... | |
void | quitar_casilla (const Casilla &cas) |
Se ejecutará al escribir una casilla para quitarla del grupo Esto tiene como propósito ir simplificando los grupos lo máximo posible para aumentar la posibilidad de que el grupo entero caiga dentro de cierta estructura (este caso nos da mucha información sobre los dígitos posibles en la estructura) Más... | |
void | rellena_comb_y_pos () |
Rellena las todas las posibles sumas del grupo con cada una de sus posiciones posibles. Más... | |
void | limp_comb_en_fila (const Casilla &cas) |
Limpia todas las combinaciones de la fila que contengan el dígito de la casilla cas. Más... | |
void | limp_comb_no_en_fila (const Casilla &cas) |
Limpia todas las posiciones que tengan al dígito de cas en una casilla en la fila en la que se encuentra cas (reglas del Sudoku) Más... | |
void | limp_comb_en_col (const Casilla &cas) |
Limpia todas las combinaciones de la columna que contengan el dígito de la casilla cas. Más... | |
void | limp_comb_no_en_col (const Casilla &cas) |
Limpia todas las posiciones que tengan al dígito de cas en una casilla en la col en la que se encuentra cas (reglas del Sudoku) Más... | |
void | limp_comb_en_cubo (const Casilla &cas) |
Limpia todas las combinaciones del cubo que contengan el dígito de la casilla cas. Más... | |
void | limp_comb_no_en_cubo (const Casilla &cas) |
Limpia todas las posiciones que tengan al dígito de cas en una casilla en el cubo en la que se encuentra cas (reglas del Sudoku) Más... | |
const vector< Casilla > & | obtener_determinados () const |
Obtiene las casillas totalmente determinadas por un proceso de eliminación de posiciones. Los casos de determinación son los siguientes: Más... | |
Métodos privados | |
int | CuantasFuera_cubo (const Casilla &cubo) const |
Devuelve cuántas casillas se quedan fuera de "cubo". Más... | |
int | CuantasFuera_fila (const Casilla &fila) const |
Devuelve cuántas casillas se quedan fuera de "fila". Más... | |
int | CuantasFuera_col (const Casilla &col) const |
Devuelve cuántas casillas se quedan fuera de "col". Más... | |
bool | esta_en_el_borde (const Casilla &cas) |
Controla si cierta casilla del grupo está en el borde de éste (puede eliminarse sin desconectar el grupo) Más... | |
Atributos privados | |
int | suma |
Suma de los valores de las casillas del grupo. Más... | |
vector< Casilla > | grupo |
Array de casillas que tiene el grupo. Más... | |
vector< vector< vector< int > > > | combinaciones |
Vector de matrices, donde cada matriz representa una combinación y dentro de esa matriz cada columna representa distintas posiciones precisas de dicha combinación. Más... | |
TDA Grupo Representa los conjuntos contiguos de celdas marcados con línea discontinua en un Sudoku Killer.
Una instancia grupo del tipo de dato abstracto Grupo
es un objeto dotado un conjunto de casillas contiguas; la suma de los valores de estas, y el conjunto de combinaciones posibles.
Lo representamos como una estructura con un vector de casillas y un entero como suma, aparte de un vector matrices, donde cada una de esas matrices está asociada a un conjunto de enteros positivos que suma suma, y cada una de las columnas de esas matrices, que tendrán tantas filas como elementos tenga el grupo, será una posible ordenación de los elementos del grupo (fijada cada casilla para cada una de las filas)
|
private |
Devuelve cuántas casillas se quedan fuera de "col".
col | Una casilla de la columna |
|
private |
Devuelve cuántas casillas se quedan fuera de "cubo".
cubo | La esquina superior izquierda del cubo |
|
private |
Devuelve cuántas casillas se quedan fuera de "fila".
fila | Una casilla de la fila |
|
private |
Controla si cierta casilla del grupo está en el borde de éste (puede eliminarse sin desconectar el grupo)
Procederá simulando iterando sobre cada una de las otras casillas del grupo y comprobando si para cada una de éstas existe al menos una de las otras casillas del grupo (no contando sobre la que nos estamos planteando) tal que ésta esté en la misma fila y a una sola columna de distancia, o en la misma columna y a una sola fila de distancia
cas | casilla que se comprobara si está en el borde, para poder recortar el grupo |
const vector<Casilla>& Grupo::getCasillas | ( | ) | const |
Recupera las casillas de grupo.
const vector<vector<vector<int> > >& Grupo::getCombinaciones | ( | ) | const |
Recupera las combinaciones posibles del grupo (basadas en el instante del tablero)
int Grupo::getSuma | ( | ) | const |
Recupera la suma asociada al grupo.
bool Grupo::InCol | ( | ) | const |
Informa sobre si el grupo está enteramente contenido en una columna.
bool Grupo::InCubo | ( | ) | const |
Informa sobre si el grupo está enteramente contenido en un cubo.
bool Grupo::InFila | ( | ) | const |
Informa sobre si el grupo está enteramente contenido en una fila.
void Grupo::limp_comb_en_col | ( | const Casilla & | cas | ) |
Limpia todas las combinaciones de la columna que contengan el dígito de la casilla cas.
cas | Última casilla escrita |
void Grupo::limp_comb_en_cubo | ( | const Casilla & | cas | ) |
Limpia todas las combinaciones del cubo que contengan el dígito de la casilla cas.
cas | Última casilla escrita |
void Grupo::limp_comb_en_fila | ( | const Casilla & | cas | ) |
Limpia todas las combinaciones de la fila que contengan el dígito de la casilla cas.
cas | Última casilla escrita |
void Grupo::limp_comb_no_en_col | ( | const Casilla & | cas | ) |
Limpia todas las posiciones que tengan al dígito de cas en una casilla en la col en la que se encuentra cas (reglas del Sudoku)
cas | Última casilla escrita |
void Grupo::limp_comb_no_en_cubo | ( | const Casilla & | cas | ) |
Limpia todas las posiciones que tengan al dígito de cas en una casilla en el cubo en la que se encuentra cas (reglas del Sudoku)
cas | Última casilla escrita |
void Grupo::limp_comb_no_en_fila | ( | const Casilla & | cas | ) |
Limpia todas las posiciones que tengan al dígito de cas en una casilla en la fila en la que se encuentra cas (reglas del Sudoku)
cas | Última casilla escrita |
const vector<Casilla>& Grupo::obtener_determinados | ( | ) | const |
Obtiene las casillas totalmente determinadas por un proceso de eliminación de posiciones. Los casos de determinación son los siguientes:
El grupo tiene más de una única combinación posible, pero todas comparten un dígito y ese dígito siempre se encuentra en la misma casilla (posición del vector) en todas las posiciones posibles
Notemos que el caso de la obtención de un grupo unitario por la reducción de los grupos tras escritura queda considerado en el primer guion.
void Grupo::quitar_casilla | ( | const Casilla & | cas | ) |
Se ejecutará al escribir una casilla para quitarla del grupo Esto tiene como propósito ir simplificando los grupos lo máximo posible para aumentar la posibilidad de que el grupo entero caiga dentro de cierta estructura (este caso nos da mucha información sobre los dígitos posibles en la estructura)
Se eliminará la casilla del vector grupo, y se ajustarán los sumandos y posiciones adecuadamente.
cas | la casilla que se borra del grupo |
void Grupo::rellena_comb_y_pos | ( | ) |
Rellena las todas las posibles sumas del grupo con cada una de sus posiciones posibles.
void Grupo::setCasillas | ( | const vector< Casilla > & | cas | ) |
Fija las casillas de grupo.
cas | vector de casillas |
void Grupo::setCombinaciones | ( | const vector< vector< vector< int >>> & | comb | ) |
Fija las combinaciones posibles del grupo (basadas en el instante del tablero)
void Grupo::setSuma | ( | int | sum | ) |
Fija la suma asociada al grupo.
sum | suma que asigno al grupo |
|
private |
Vector de matrices, donde cada matriz representa una combinación y dentro de esa matriz cada columna representa distintas posiciones precisas de dicha combinación.
Es decir, la combinación 154, tendrá en sus columnas las distintas posiciones a las que llamamos 154, 145, 415, 451, 514 y 541.
Recalquemos que cada índice del vector grupo
fija una fila de esa matriz.
|
private |
Array de casillas que tiene el grupo.
suma
|
private |
Suma de los valores de las casillas del grupo.
suma
<= 81