Programando a pasitos (http://www.pro gramandoapasit os.com/) Resolver sudokus en Java (http://www.programandoapasitos.com/2017/07/res olver-sudokus-con-java.html) 1 3 : 0 7 P O S T E D B Y I N A Z I O C L A V E R J A V A ( H T T P : / / W W W . P R O G R A M A N D O A PA S I T O S . C O M / S E A R C H / L A B E L / J A V A ) N O C O M M E N T S ( H T T P : / / W W W . P R O G R A M A N D O A PA S I T O S . C O M / 2 0 1 7 / 0 7 / R E S O LV E R - S U D O K U S - C O N - J A V A . H T M L # C O M M E N T FORM) No es un bug, es una característica no documentada (https://4.bp.blogspot.com/PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? h82e62D4OpQ/WW8qfpYrQwI/AAAAAAAAH0I/fQ0N_ArORiY27gBzR6JOJxYK5GNsOpWywCLcBGAs/s1600/logo.png) El otro día estaba haciendo el sudoku del periódico y me plantee la siguiente duda. ¿Cómo sería un programa que te resolviese el sudoku automáticamente? Para el que no lo sepa, un sudoku es un pasatiempo japonés consistente en rellenar un tablero de 9x9, que a su vez está divido en secciones de 3x3, con números del 1 al nueve de tal manera que ninguno de ellos puede estar repetido en ninguna fila, columna o secciones. Como curiosidad, sabed que el problema de un sudoku sólo se considera bien planteado si su solución es única, consiguiéndose esto sólo si, como mínimo, hay ya preestablecidas 17 cifras dentro del tablero (Wikipedia insified (https://es.wikipedia.org/wiki/Sudoku)). (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Dicho esto, vayamos a la resolución del problema. La idea que se me ocurrió, y que luego he ido leyendo que es la más sencilla de implementar, es la del algoritmo de marcha atrás. Es decir, leeremos el tablero y, dejando siempre fijas las posiciones que ya están preestablecidas, iremos casilla por Busca... y encontrarás casilla aumentando valor en uno.adblocker Si el valorme de ayudarás esa casillaa cumple conellas reglas sudoku (ya sabéis, no ¿Sabías que su si deshabilitas mantener blog y mi del segundo barco? / repetirse ni en su fila, columna ni sección) la dejamos tal cual y saltamos a la siguiente. Programando a pasitos (http://www.pro gramandoapasit os.com/) Si no se cumple, incrementará el valor de dicha casilla hasta que esa condición se cumpla o hasta sobrepasar el valor de 9. En ese caso de sobrepasar dicho valor, lo que haremos será retroceder a la anterior casilla modificable e incrementar su valor en 1, repitiendo el proceso anterior. No es un bug, es una característica no documentada PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) De este modo, solucionaríamos un sudoku cuando todas las casillas estén completamente validadas, y sería irresoluble si la primera casilla editable supera el valor de 9. Es decir, que el método empleado lo podemos considerar como un ataque de fuerza bruta. Costoso en tiempos computacionales, pero era la solución más sencilla de implementar que se me ocurrió. Probablemente haya muchas mejores formas de hacerlo, podéis decirme las vuestras en los comentarios. ¡A programar! Sabiendo esto, vamos a pasar al código. Lo primero que debéis saber es que aquí sólo voy a mostrar la lógica de la resolución. Puedes acceder al código completo en mi repositorio de Github (https://github.com/inazense/SudokuSolver). Incluye la interfaz gráfica entre otras mejoras que me encuentro desarrollando actualmente. Participantes Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / El primer paso será definir los participantes que necesitaremos para solucionar el sudoku, que serán un tablero, Programando a pasitos (http://www.pro gramandoapasit os.com/) las casillas que lo compongan y las secciones en las que lo dividiremos. Así pues, vamos a ir de menos a más. Lo primero será definir las secciones, en una enumeración. Enum Sector No es un bug, es una característica package participantes; no documentada /** * Enum con los posibles sectores del sudoku. PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) * Un sector es la caja de 3x3 en la que se divide el tablero de 9x9 * @author Inazio * */ public enum Sector { PRIMERO, SEGUNDO, TERCERO, CUARTO, QUINTO, SEXTO, SEPTIMO, OCTAVO, NOVENO DESCARGAS } (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO Como podemos ver, es una enumeración sencilla en la que nos limitamos a nombrar los nueve sectores de nuestro tablero. Casilla S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es una característica no documentada package participantes; /** * Clase que contiene toda la información relevante de una casilla de Sudoku 9x9 * @author Inazio * */ public class Casilla { /// PROPIEDADES private int valor; private int posX; PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) private int posY; private Sector sector; private boolean editable; /// CONSTRUCTORES /** * Inicializa una casilla vacía */ public Casilla() {} /** * * @param valor * @param posX * @param posY * @param sector * @param editable */ public Casilla(int valor, int posX, int posY, Sector sector, boolean editable) { Busca... y encontrarás this.valor = valor; ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) this.posX = posX; this.posY = posY; this.sector = sector; this.editable = editable; } /// METODOS No es un bug, es una característica no documentada /** * Establece el sector dependiendo de la posición X e Y de la casilla */ public void establecerSectorSegunPosicion() { PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS switch(posX) { case 0: case 1: case 2: switch(posY) { case 0: case 1: case 2: this.setSector(Sector.PRIMERO); (HTTP://PROGRAMANDOAPASITO break; S.BLOGSPOT.COM/P/DESCARGAS. case 3: HTML) case 4: case 5: ¿LOS CONOCES? this.setSector(Sector.SEGUNDO); (HTTP://PROGRAMANDOAPASITO break; S.BLOGSPOT.COM.ES/P/BLOG- case 6: PAGE.HTML) case 7: case 8: this.setSector(Sector.TERCERO); break; Busca... y encontrarás default: ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / break; Programando a pasitos (http://www.pro gramandoapasit os.com/) } break; case 3: case 4: case 5: switch(posY) { No es un bug, es case 0: una característica case 1: no documentada case 2: this.setSector(Sector.CUARTO); break; PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) case 3: case 4: case 5: this.setSector(Sector.QUINTO); break; case 6: case 7: case 8: this.setSector(Sector.SEXTO); DESCARGAS break; (HTTP://PROGRAMANDOAPASITO default: S.BLOGSPOT.COM/P/DESCARGAS. break; HTML) } break; ¿LOS CONOCES? case 6: (HTTP://PROGRAMANDOAPASITO case 7: S.BLOGSPOT.COM.ES/P/BLOG- case 8: PAGE.HTML) switch(posY) { case 0: case 1: case 2: Busca... y encontrarás this.setSector(Sector.SEPTIMO); ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / break; Programando a pasitos (http://www.pro gramandoapasit os.com/) case 3: No es un bug, es case 7: una característica case 8: case 4: case 5: this.setSector(Sector.OCTAVO); break; case 6: no documentada this.setSector(Sector.NOVENO); break; default: break; PÁGINA PRINCIPAL } (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? break; } } /** * Devuelve el valor de la casilla * @return Entero entre 0 y 9 */ public int getValor() { return valor; } /** (HTTP://PROGRAMANDOAPASITO * Establece el valor de la casilla S.BLOGSPOT.COM.ES/P/BLOG- * @param valor Entero entre 0 y 9 PAGE.HTML) */ public void setValor(int valor) { this.valor = valor; } Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / /** Programando a pasitos (http://www.pro gramandoapasit os.com/) * Devuelve la posición horizontal * @return Entero entre 0 y 8 */ public int getPosX() { return posX; } No es un bug, es una característica no documentada /** * Establece la posición horizontal * @param posX Entero entre 0 y 8 */ PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO public void setPosX(int posX) { this.posX = posX; } /** * Devuelve la posición vertical * @return Entero entre 0 y 8 */ public int getPosY() { return posY; } S.BLOGSPOT.COM/P/DESCARGAS. HTML) /** * Establece la posición vertical ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) * @param posY Entero entre 0 y 8 */ public void setPosY(int posY) { this.posY = posY; } /** Busca... y encontrarás * Devuelve sector de adblocker la casilla ¿Sabías queel si deshabilitas me ayudarás a mantener el blog y mi segundo barco? / * @return Sector preestablecido en Enum Sector Programando a pasitos (http://www.pro gramandoapasit os.com/) */ public Sector getSector() { return sector; } /** No es un bug, es * Establece el sector de la casilla una característica * @param sector Propiedad del enum Sector no documentada */ public void setSector(Sector sector) { this.sector = sector; PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) } /** * Devuelve si la casilla tiene un valor fijo o no * @return True -> Valor fijo. False -> Valor modificable ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) */ public boolean isEditable() { return editable; } DESCARGAS (HTTP://PROGRAMANDOAPASITO /** * Establece la opción de editar la casilla S.BLOGSPOT.COM/P/DESCARGAS. * @param editable True -> editable. False -> no editable HTML) */ ¿LOS CONOCES? public void setEditable(boolean editable) { (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) this.editable = editable; } } En esta clase establecemos las propiedades de cada una de nuestras casillas. Busca... y encontrarás Su posición horizontal y vertical, su valor, el sector al que pertenece y si es o no editable. ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) Ingeniería Industrial CGT No es un bug, es una característica UTP no documentada Estudia de forma semipresencial, con horarios exibles y obtén tu título profesional. En los métodos creamos los getters y setters y un método más, el de establecerSectorSegunPosicion() que PÁGINA PRINCIPAL usaremos para indicar a que sector pertenece nuestra casilla. (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO Tablero Esta clase vamos a comentarla un poco más, aunque también es muy sencillita. S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es una característica no documentada public class Tablero { /// PROPIEDADES private Casilla[][] casillas; /// CONSTRUCTOR /** * Genera un tablero de sudoku básico de 9x9 */ public Tablero() { this.casillas = new Casilla[9][9]; PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO } S.BLOGSPOT.COM.ES/) /// METODOS ANECDOTARIO (HTTP://PROGRAMANDOAPASITO /** S.BLOGSPOT.COM.ES/P/ANECDOT * Devuelve las casillas del tablero ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) * @return */ public Casilla[][] getCasillas() { return this.casillas; } } ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO Lo primero, vemos que la definición de las propiedades y del constructor no tiene mucha miga. Simplemente S.BLOGSPOT.COM.ES/P/BLOG- establecemos una matriz de casillas y en su constructor la inicializamos. Además generamos un getter para PAGE.HTML) nuestras casillas. Hecho esto, vamos a ver los diferentes métodos que podemos emplear: Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es una característica no documentada /** * Inicializa el tablero estableciendo por defecto los valores: * Valor = 0 * PosX = i * PosY = j * Editable = true * Sector = Según posición */ public void inicializarTablero() { for (int i = 0; i < this.casillas.length; i++) { for (int j = 0; j < this.casillas[i].length; j++) { Casilla casilla = new Casilla(); PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO casilla.setValor(0); S.BLOGSPOT.COM.ES/) casilla.setPosX(i); casilla.setPosY(j); ANECDOTARIO casilla.setEditable(true); (HTTP://PROGRAMANDOAPASITO casilla.establecerSectorSegunPosicion(); S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? this.casillas[i][j] = casilla; } } } Este método es el encargado de inicializar una por una nuestras casillas. Recorremos la matriz y establecemos su posición, calculamos su sector, le indicamos que es editable y establecemos un valor por defecto de 0. (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es /** * Establece una nueva casilla en la posición que tenga configurada la misma * @param casilla */ public void editarCasilla(Casilla casilla) { this.casillas[casilla.getPosX()][casilla.getPosY()] = casilla; } una característica no documentada Aquí le indicamos que copie la casilla pasada por parámetro a la casilla que está en el tablero con su misma posición, horizontal y vertical. PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS /** * Reestablece el valor de la casilla según su posición * @param x Posición horizontal * @param y Posición vertical */ public void reestablecerCasillaPorPosicion(int x, int y) { this.casillas[x][y].setValor(0); } En este método reseteamos el valor de una casilla pasando por parámetro su posición dentro de la matriz. (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es una característica /** * Inserta los valores de la matriz en la misma casilla respecto a su posición * Ha tenido que inicializarse la matriz de casillas previamente * @param matriz Matriz de enteros entre 0 y 9 */ public void insertarValores(int[][] matriz) { for (int i = 0; i < matriz.length; i++) { for (int j = 0; j < matriz[i].length; j++) { no documentada if (matriz[i][j] != 0) { this.casillas[i][j].setEditable(false); } this.casillas[i][j].setValor(matriz[i][j]); PÁGINA PRINCIPAL } (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) } } ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO Y por último, con este método rellenamos nuestra matriz de casillas usando la matriz de enteros pasada por parámetro. Copiamos los valores en las mismas posiciones. También indicamos que si ese valor es 0, la casilla siga como editable y si no, que pase a ser no editable. Éste método ha de usarse SIEMPRE una vez que ha inicializado todas las casillas Solucionador Esta clase la vamos a tratar igual que Tablero, yendo paso a paso por sus métodos. Es una clase exclusivamente dedicada a operar para resolver el sudoku y no tiene ninguna propiedad suya ni ningún constructor personalizado, así que la definimos simplemente así: S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es una característica no documentada package utiles; import java.util.ArrayList; import participantes.Casilla; import participantes.Tablero; public class Solucionador { } Hecho esto, vamos a ver los métodos uno por uno. PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS /** * Devuelve un array con todas las casillas en las que la propiedad editable es verdadera * @param casillas Matriz de casillas * @return Array con las casillas editables */ private ArrayList extraerCasillasEditables(Casilla[][] casillas) { ArrayList editables = new ArrayList(); (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. for (int i = 0; i < casillas.length; i++ ) { for (int j = 0; j < casillas[i].length; j++) { HTML) if (casillas[i][j].isEditable()) { ¿LOS CONOCES? editables.add(casillas[i][j]); (HTTP://PROGRAMANDOAPASITO } S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) } } return editables; } Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Éste método es utilizado para permitirnos saber que casillas hemos de recorrer incrementando su valor, es decir, Programando a pasitos (http://www.pro gramandoapasit os.com/) que casillas son editables por nuestro programa. Así podremos avanzar / retroceder entre ellas sin tenernos que preocupar de controlar los dos niveles de una matriz. No es un bug, es una característica no documentada PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es una característica no documentada /** * Extrae las casillas que contengan la misma fila, columna o sector que la casilla actual * @param tablero Tablero de 9x9 * @param actual Casilla actual * @return ArrayList que contiene tres arrayList de casillas. Fila, columna y sector */ private ArrayList> extraerCasillasComparables(Tablero tablero, Casilla actual) { ArrayList fila = new ArrayList(); ArrayList columna ArrayList sector = new ArrayList(); = new ArrayList(); PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) for (int i = 0; i < tablero.getCasillas().length; i++) { for (int j = 0; j < tablero.getCasillas()[i].length; j++) { if (tablero.getCasillas()[i][j].getPosX() == actual.getPosX()) { ANECDOTARIO fila.add(tablero.getCasillas()[i][j]); (HTTP://PROGRAMANDOAPASITO } S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) if (tablero.getCasillas()[i][j].getPosY() == actual.getPosY()) { columna.add(tablero.getCasillas()[i][j]); DESCARGAS } (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. if (tablero.getCasillas()[i][j].getSector() == actual.getSector()) { HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) sector.add(tablero.getCasillas()[i][j]); } } } ArrayList> resultado = new ArrayList>(); resultado.add(fila); resultado.add(columna); Busca... y encontrarás resultado.add(sector); ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) return resultado; } Aquí lo que hacemos es extraer todas las casillas que coincidan con la fila, columna o sector de la casilla que pasamos como parámetro y que esté dentro del tablero (valga la redundancia, ¿verdad?) para usarla como comparativas y validar si es correcto. No es un bug, es una característica no documentada PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es una característica no documentada /** * Valida la fila, columna y sector. Si no se repite ningun numero (sin contar el 0) * es una lista válida * @param listas ArrayList de arraylist de casillas * @return True si validacion correcta. False en caso contrario */ private boolean validacionFCS(ArrayList> listas) { for (ArrayList lista : listas) { ArrayList valores = null; valores = new ArrayList(); PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO for (Casilla casilla : lista) { S.BLOGSPOT.COM.ES/) if (casilla.getValor() != 0) { if (valores.contains(casilla.getValor())) { ANECDOTARIO return false; (HTTP://PROGRAMANDOAPASITO } S.BLOGSPOT.COM.ES/P/ANECDOT else { ARIO.HTML) valores.add(casilla.getValor()); } DESCARGAS } (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO } } return true; } S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Habiendo extraido los valores de fila, columan y sector con el método anterior, pasaremos esos arraylist (uno a uno) a este método, que se encargará de validar si en esa lista tenemos valores repetidos o no. Nos servirá para realizar la validación de las reglas del sudoku. Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es una característica no documentada /** * Método que controla las operaciones necesarias para solucionar el sudoku * @param tablero Tablero que contiene las casillas del sudoku * @return boolean. True = Sudoku solucionado. False = Sudoku sin solucionar */ public Tablero solucionarSudoku(Tablero tablero) { ArrayList editables = this.extraerCasillasEditables(tablero.getCasillas()); int i = 0; while (i < editables.size()) { PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) // Control de salida. Si el primer resultado es igual a 0 y su valor superior al máximo permitido por el sudoku, // error al solucionar el sudoku Casilla actual = editables.get(i); ANECDOTARIO if (actual.getValor() > 9) { (HTTP://PROGRAMANDOAPASITO tablero.reestablecerCasillaPorPosicion(actual.getPosX(), actual.getPosY()); S.BLOGSPOT.COM.ES/P/ANECDOT i--; ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) if (i < 0) { return null; } else { actual = editables.get(i); actual.setValor(actual.getValor() + 1); ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) tablero.editarCasilla(actual); } } else { if (actual.getValor() == 0) { actual.setValor(1); Busca... y encontrarás } ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) ArrayList> listasParaValidar = this.extraerCasillasComparables(tablero, actual); // Validar si listas cumplen reglas de Sudoku (salvo valor sin rellenar) if (validacionFCS(listasParaValidar)) { tablero.editarCasilla(actual); i++; No es un bug, es } una característica else no documentada { actual.setValor(actual.getValor() + 1); if (actual.getValor() > 9) { tablero.reestablecerCasillaPorPosicion(actual.getPosX(), actual.getPosY()); PÁGINA PRINCIPAL if (i != 0) { (HTTP://PROGRAMANDOAPASITO i--; S.BLOGSPOT.COM.ES/) actual = editables.get(i); actual.setValor(actual.getValor() + 1); ANECDOTARIO tablero.editarCasilla(actual); (HTTP://PROGRAMANDOAPASITO } S.BLOGSPOT.COM.ES/P/ANECDOT else { ARIO.HTML) return null; } DESCARGAS } (HTTP://PROGRAMANDOAPASITO } S.BLOGSPOT.COM/P/DESCARGAS. } HTML) ¿LOS CONOCES? } (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) return tablero; } Y aquí tenemos al método padre. El método principal que se encarga de gestionar los anteriormente descritos. Busca... y encontrarás Le pasamos un tablero como parámetro, y su tarea es entrar en un bucle que recorra todas las casillas editables, ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / del que sólo saldrá si ya no podemos darle más valor a la primera casilla editable, devolviendo un nulo, o si hemos Programando a pasitos (http://www.pro gramandoapasit os.com/) llegado al final del sudoku completando todas las casillas, devolviendo el tablero ya resuelto. Ingeniería Industrial CGT No es un bug, es Estudia de forma semipresencial, con horarios exibles y obtén tu título profesional. una característica no documentada UTP PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO De esta forma, dependiendo del resultado nosotros podremos pintar el tablero ya resulto o mostrar un mensaje de "imposible resolver" o algo similar (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (https://4.bp.blogspot.com/- (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás Q0weoWa7TgI/WW88CTsLJwI/AAAAAAAAH0c/AUvglkmVs_AwpPwk_LW-GXqRUPPVfOQwCLcBGAs/s1600/ejemplo1.png) Sudoku resuelto ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) (https://3.bp.blogspot.com/-lrjKKP1qo2Y/WW88W- No es un bug, es una característica no documentada nco8I/AAAAAAAAH0g/TsJdvEwfra0YSa8yoK1hP4NT1SnSr-dlgCLcBGAs/s1600/ejemplo%2B2.png) Sudoku no resuelto PÁGINA PRINCIPAL Como ya dije previamente, éste post solo muestra la lógica resolutiva del sudoku. Si quieres ver como está hecha (HTTP://PROGRAMANDOAPASITO la interfaz gráfica, como volcar un sudoku desde un CSV, una imagen... te recomiendo que revises el repositorio de S.BLOGSPOT.COM.ES/) ANECDOTARIO SudokuSolver en GitHub (https://github.com/inazense/SudokuSolver). ¡Salud y coding! (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. Entrada más reciente (http://www.programandoapasitos.com/2017/07/tutorial-maven-en-eclipse.html) Página principal (http://www.proEntrada antigua (http://www.programandoapasitos.com/2017/04/como-leer-fichero-csv-con-java.html) gramandoapasitos.com/) HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) 0 comentarios: Publicar un comentario (https://www.blogger.com/comment-iframe.g? Busca... y encontrarás blogID=4805562091777147038&postID=4374162150100028580&blogspotRpcToken=5025302) ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) Introduce tu comentario... Comentar como: Publicar rmdlazaro@gm Cerrar sesión Vista previa Avisarme No es un bug, es una característica no documentada PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / sitos.com/search/label/Bases Programando a pasitos (http://www.pro gramandoapasit os.com/) %20de%20datos) Desarrollo de interfaces (http://www.programandoapa sitos.com/search/label/Desarr ollo%20de%20interfaces) Entornos de desarrollo No es un bug, es (http://www.programandoapa una característica sitos.com/search/label/Entor no documentada nos%20de%20desarrollo) Lenguaje de marcas (http://www.programandoapa PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) sitos.com/search/label/Lengu aje%20de%20marcas) Programación (http://www.programandoapa sitos.com/search/label/Progr amaci%C3%B3n) Programación de servicios y procesos (http://www.programandoapa DESCARGAS sitos.com/search/label/Progr (HTTP://PROGRAMANDOAPASITO amaci%C3%B3n%20de%20se S.BLOGSPOT.COM/P/DESCARGAS. rvicios%20y%20procesos) HTML) Programación multimedia y dispositivos móviles ¿LOS CONOCES? (http://www.programandoapa (HTTP://PROGRAMANDOAPASITO sitos.com/search/label/Progr S.BLOGSPOT.COM.ES/P/BLOG- amaci%C3%B3n%20multime PAGE.HTML) dia%20y%20dispositivos%20 m%C3%B3viles) Sistemas de gestión empresarial Busca... y encontrarás (http://www.programandoapa ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / sitos.com/search/label/Siste Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es mas%20de%20gesti%C3%B3 n%20empresarial) Sistemas informáticos (http://www.programandoapa sitos.com/search/label/Siste mas%20inform%C3%A1ticos) Varios una característica (http://www.programandoapa no documentada sitos.com/search/label/Varios ) PÁGINA PRINCIPAL TECNOLOGÍAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ADA (http://www.programandoapa ANECDOTARIO sitos.com/search/label/ADA) (HTTP://PROGRAMANDOAPASITO Android S.BLOGSPOT.COM.ES/P/ANECDOT (http://www.programandoapa ARIO.HTML) sitos.com/search/label/Androi d) DESCARGAS Apache (HTTP://PROGRAMANDOAPASITO (http://www.programandoapa S.BLOGSPOT.COM/P/DESCARGAS. sitos.com/search/label/Apach HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) e) C (http://www.programandoapa sitos.com/search/label/C) Cisco (http://www.programandoapa sitos.com/search/label/Cisco) CMS Busca... y encontrarás (http://www.programandoapa ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es una característica no documentada Tus clientes estan en línea PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) Más Información DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? MÓDULOS DAM (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Acceso a datos (http://www.programandoapa sitos.com/search/label/Acces o%20a%20datos) Bases de datos Busca... y encontrarás (http://www.programandoapa ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / sitos.com/search/label/CMS) Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es CSS (http://www.programandoapa sitos.com/search/label/CSS) Git (http://www.programandoapa sitos.com/search/label/Git) Hibernate una característica (http://www.programandoapa no documentada sitos.com/search/label/Hiber nate) HTML PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (http://www.programandoapa sitos.com/search/label/HTML) Java (http://www.programandoapa sitos.com/search/label/Java) JavaScript (http://www.programandoapa sitos.com/search/label/JavaS cript) JSP (HTTP://PROGRAMANDOAPASITO (http://www.programandoapa S.BLOGSPOT.COM/P/DESCARGAS. sitos.com/search/label/JSP) HTML) Libros (http://www.programandoapa ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) sitos.com/search/label/Libros ) Linux (http://www.programandoapa sitos.com/search/label/Linux) MySQL (http://www.programandoapa Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / sitos.com/search/label/MySQ Programando a pasitos (http://www.pro gramandoapasit os.com/) L) OneDrive (http://www.programandoapa sitos.com/search/label/OneDr ive) Oracle Database No es un bug, es (http://www.programandoapa una característica sitos.com/search/label/Oracle no documentada %20Database) PHP (http://www.programandoapa PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) sitos.com/search/label/PHP) Python (http://www.programandoapa sitos.com/search/label/Pytho n) React (http://www.programandoapa sitos.com/search/label/React) Virtualizacion DESCARGAS (http://www.programandoapa (HTTP://PROGRAMANDOAPASITO sitos.com/search/label/Virtual S.BLOGSPOT.COM/P/DESCARGAS. izacion) HTML) XML (http://www.programandoapa ¿LOS CONOCES? sitos.com/search/label/XML) (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a (https://github.com/inazense/) pasitos (http://www.pro gramandoapasit os.com/) (https://twitter.com/Inazense) (mailto:[email protected]) Copyright © 2020 Programando a pasitos (http://www.programandoapasitos.com/) | Powered by Blogger (http://www.blogger.com/) Design by Site5 WordPress Themes (http://www.s5themes.com/) | Blogger Theme by NewBloggerThemes.com (http://newbloggerthemes.com/) No es un bug, es una característica no documentada PÁGINA PRINCIPAL (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) Busca... y encontrarás ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? / Programando a pasitos (http://www.pro gramandoapasit os.com/) No es un bug, es una característica no documentada PÁGINA PRINCIPAL Convie e visitas físicas en visitas en línea. (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/) ANECDOTARIO (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/ANECDOT ARIO.HTML) DESCARGAS Más Información (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM/P/DESCARGAS. HTML) ¿LOS CONOCES? (HTTP://PROGRAMANDOAPASITO S.BLOGSPOT.COM.ES/P/BLOGPAGE.HTML) HISTÓRICO julio 2017 (2) Con la tecnología de Blogger Busca... y encontrarás (https://www.blogger.com). ¿Sabías que si deshabilitas adblocker me ayudarás a mantener el blog y mi segundo barco? /