//rellenar public void rellena(GrillaSudoku grid) { bool algunCambio = false; int numElegido; do { algunCambio = false; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (grid.grilla[i, j] == 0) { numElegido = ListaPosible(i, j, grid); if (numElegido == 1) { grid.setearCeldaUsuario(i, j, PrimerVerdadero()); algunCambio = (grid.grilla[i, j] != 0); } } } } } while (algunCambio == true && !estaResuelto(grid)); }
//resolver grilla public bool resolverGrilla(GrillaSudoku g, bool chequearUnicidad) { GrillaSudoku grilla = new GrillaSudoku(); grilla = (GrillaSudoku)g.Clone(); int i, eleccion, r, c, numeroElegido; bool bien, got_one, resuelto, result; got_one = false; recursiones++; rellena(grilla); if (estaResuelto(grilla)) { if (numSolns > 0) { stop = true; result = false; } else { numSolns++; final[numSolns] = (GrillaSudoku)g.Clone(); result = true; solucion = grilla; } } else { if (!masPequeña(grilla, out r, out c, out numeroElegido)) { result = false; } else { i = 1; bien = false; got_one = false; while (!bien && i <= numeroElegido) { eleccion = PickeoUno(); list[eleccion] = false; grilla.setearCeldaUsuario(r, c, eleccion); if (recursiones < max) { resuelto = (resolverGrilla(grilla, chequearUnicidad)); } else { resuelto = false; } if (stop == true) { bien = true; got_one = true; } else { got_one = (got_one || resuelto); if (!chequearUnicidad) { bien = got_one; } } i++; } result = got_one; } } return(result); }