Subido por Ramón De la cruz Lázaro

Resolver sudokus en Java Programando a pasitos

Anuncio
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?
/
Descargar