//devuelve grilla resuelta public GrillaSudoku InicializarGrilla() { //rellena aleatoreamente primera fila y columna GrillaSudoku tempGrilla = new GrillaSudoku { }; //grilla temporaria int fila = 0; int col = 0; int nuevoVal; //valor para poner dentro de grilla List <int> setValor = new List <int>(Enumerable.Range(-9, 9)); //rango de numeros List <int> setValor2 = new List <int>(); Random rnd = new Random(); //numero random int numRandom = 0; numRandom = rnd.Next(0, 8); nuevoVal = setValor[numRandom]; tempGrilla.inicializarCeldas(fila, col, nuevoVal); setValor.Remove(nuevoVal); for (fila = 1; fila < 9; fila++) { numRandom = rnd.Next(0, setValor.Count); nuevoVal = setValor[numRandom]; setValor2.Add(nuevoVal); setValor.Remove(nuevoVal); tempGrilla.inicializarCeldas(fila, col, nuevoVal); } fila = 0; for (col = 1; col < 3; col++) { numRandom = rnd.Next(0, setValor2.Count); nuevoVal = setValor2[numRandom]; while ((nuevoVal == tempGrilla.grilla[1, 0] || (nuevoVal == tempGrilla.grilla[2, 0]))) { numRandom = rnd.Next(0, setValor2.Count); nuevoVal = setValor2[numRandom]; } setValor2.Remove(nuevoVal); tempGrilla.inicializarCeldas(fila, col, nuevoVal); } for (col = 3; col < 9; col++) { numRandom = rnd.Next(0, setValor2.Count); nuevoVal = setValor2[numRandom]; setValor2.Remove(nuevoVal); tempGrilla.inicializarCeldas(fila, col, nuevoVal); } do { solucionadorSudoku = new SolucionadorSudoku(); solucionadorSudoku.resolverGrilla((GrillaSudoku)tempGrilla.Clone(), false); GrillaSolucion = solucionadorSudoku.solucion; } while (GrillaSolucion == null || GrillaSolucion.estaEnBlanco()); PermaGrilla = borrarCuadros(GrillaSolucion); return(PermaGrilla); }
//toma el sudoku resuelto y le saca algunos numeros public GrillaSudoku borrarCuadros(GrillaSudoku grillaResuelta) { GrillaSudoku grillaTemporal; GrillaSudoku guardarCopia; bool unico = true; int totalDeNumSacados = 0; int intentos = 0; int espaciosEnBlancoDeseados; //cantidad de espacios en blanco deseados int simetria = 0; grillaTemporal = (GrillaSudoku)grillaResuelta.Clone(); Random rnd = new Random(); switch (dificultad) //cantidad de espacios en blancos deseados segun dificultad { case Difficulty.Easy: //easy espaciosEnBlancoDeseados = 10; break; case Difficulty.Medium: //medium espaciosEnBlancoDeseados = 25; break; case Difficulty.Hard: //hard espaciosEnBlancoDeseados = 40; break; default: espaciosEnBlancoDeseados = 60; break; } simetria = rnd.Next(0, 2); //selecciona simetria random do { guardarCopia = (GrillaSudoku)grillaTemporal.Clone(); grillaTemporal = borrarAzar(grillaTemporal, simetria, ref totalDeNumSacados); //borra 1 o 2 cuadros depende simetria solucionadorSudoku = new SolucionadorSudoku(); unico = solucionadorSudoku.resolverGrilla((GrillaSudoku)grillaTemporal.Clone(), true); if (!unico) { grillaTemporal = (GrillaSudoku)guardarCopia.Clone(); intentos++; } } while ((totalDeNumSacados < espaciosEnBlancoDeseados) && (intentos < 1000)); grillaResuelta = grillaTemporal; grillaResuelta.Termina(); return(grillaResuelta); }
//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); }