//Sudoku - Fernando Méndez Torrubiano #include "TableroSudoku.h" using namespace std; bool cargar(tTableroSudoku& tablero, string nombreFichero) { bool carga = false; ifstream archivo; char ch; int num; tablero.numVacias = 0; archivo.open(nombreFichero); if (!archivo.is_open()) { carga = false; } else { for (int i = 0; i < MAXDIM; i++) { for (int j = 0; j <= MAXDIM; j++) { if (j != MAXDIM) { archivo.get(ch); switch (ch) { case ' ': iniciar(tablero.casilla[i][j], 0, vacia); tablero.numVacias++; break; default: num = (int)ch - 48; iniciar(tablero.casilla[i][j], num, fija); break; } } else { archivo.get(ch); } } } carga = true; } return carga; } void mostrar(const tTableroSudoku& tablero) { for (int i = 0; i < MAXDIM; i++){ if (i % 3 == 0) { cout << setfill('-') << setw(32) << "\n" << setfill(char(0)); } for (int j = 0; j < MAXDIM; j++){ if ((j % 3 == 0)) { cout << "|"; } mostrar(tablero.casilla[i][j]); } cout << "|" << "\n"; } cout << setfill('-') << setw(32) << "\n" << setfill(char(0)); } bool actualizar(tTableroSudoku& tablero, tCoor cor, int num) { bool actualizado = false; if ((tablero.casilla[cor.fila][cor.col].estado != fija) && (pertenece(tablero.casilla[cor.fila][cor.col].posibles, num))) { actualizar(tablero.casilla[cor.fila][cor.col], num, rellena); actualizado = true; tablero.numVacias--; } return actualizado; } bool borrar(tTableroSudoku& tablero, tCoor cor) { bool borrado = false; if ((tablero.casilla[cor.fila][cor.col].numero != 0) && (tablero.casilla[cor.fila][cor.col].estado != fija)) { borrado = true; incluir(tablero.casilla[cor.fila][cor.col].posibles, tablero.casilla[cor.fila][cor.col].numero); tablero.casilla[cor.fila][cor.col].numero = 0; tablero.casilla[cor.fila][cor.col].estado = vacia; tablero.numVacias++; } return borrado; } void mostrarCandidatos(const tTableroSudoku& tablero, tCoor cor) { if ((tablero.casilla[cor.fila][cor.col].estado == vacia) || (tablero.casilla[cor.fila][cor.col].estado == rellena)) { cout << "CANDIDATOS:"; mostrar(tablero.casilla[cor.fila][cor.col].posibles); } else { cout << "La casilla está fija." << endl; } cout << endl; } void cargarCandidatos(tTableroSudoku& tablero, tCoor cor) { //FILAS: for (int i = 0; i < MAXDIM; i++) { if (tablero.casilla[cor.fila][i].estado != vacia) { quitar(tablero.casilla[cor.fila][cor.col].posibles, tablero.casilla[cor.fila][i].numero); } } //COLUMNAS: for (int i = 0; i < MAXDIM; i++) { if (tablero.casilla[i][cor.col].estado != vacia) { quitar(tablero.casilla[cor.fila][cor.col].posibles, tablero.casilla[i][cor.col].numero); } } //SUBCUADRADO: int iniFil = (cor.fila / 3) * 3; int finFil = iniFil + 3; int iniCol = (cor.col / 3) * 3; int finCol = iniCol + 3; for (int i = iniFil; i < finFil; i++) { for (int j = iniCol; j < finCol; j++) { if (tablero.casilla[i][j].estado != vacia) { quitar(tablero.casilla[cor.fila][cor.col].posibles, tablero.casilla[i][j].numero); } } } } void completarSimples(tTableroSudoku& tablero) { for (int i = 0; i < MAXDIM; i++){ for (int j = 0; j < MAXDIM; j++){ if (actualizarSimple(tablero.casilla[i][j])) { tablero.numVacias--; } } } } int numVacias(const tTableroSudoku& tablero) { int numV = tablero.numVacias; return numV; }