Sudoku que no termina de resolverse [SOLUCIONADO]

El Sudoku indefinido – Una aventura en Java

Para cualquier apasionado de la programación y los juegulls de lógica, la tarea de resolver un Sudoku en Java que no termina puede presentar un desafío particularmente intrigante.

Cuestiones de lógica de Sudoku

La naturaleza del Sudoku reside en su simplicidad inherente. A pesar de que puede parecer desalentador a primera vista, su lógica subyacente es lineal y directa, lo que lo convierte en un blanco natural para una resolución informatizada.

Entrando en el Código de Java

Para empezar a desglosar la resolución de Sudoku en Java, primero debemos definir el Sudoku en términos comprensibles para nuestra máquina de procesamiento.

int[][] board = new int[9][9];

Este es un simple arreglo bidimensional que representará nuestro tablero de Sudoku. Cada celda puede contener un número del 1 al 9 o estar vacía, indidcado con un 0.

Resolver mediante Backtracking

Afortunadamente, la resolución de un sudoku es un buen ejemplo de un problema que puede ser resuelto mediante un algoritmo denominado backtracking.

public boolean solveSudoku(int i, int j, int[][] cells) {
	//...
}

Aquí está la base de nuestro algoritmo de backtracking, que recorrerá nuestras celdas una a una, probando números del 1 al 9.

El Corazón del Algoritmo

for (int val = 1; val <= 9; ++val) {
	if (legal(i,j,val, cells)) {
		cells[i][j] = val;
		//...
	}
}

Esto es esencialmente lo que nuestro algoritmo está haciendo. Si el valor es legal, intentará colocarlo en la celda y procederá a la siguiente.

Evaluando los Resultados

Mientras que esta es una forma tiípica de resolver un Sudoku, hay casos donde nuestra búsqueda se estanca. En lugar de encontrar una solución, quedamos atrapados en un ciclo infinito, un blucle sin fin.

if(!solveSudoku(i, j, cells)){
	cells[i][j] = 0;
}

Este es el contraargumento. Si no podemos encontrar un valor adecuado para nuestra celda actual, limpiamos el valor y volvemos atrás, a la celda previa. Eso significa que continuamos desde donde nos quedamos.

Resolviendo el bucle infinito

Esta es una de las trampas más comunes que los programadores de Java encuentran al tratar con la resolución de Sudoku; entra en un bucle que nunca se cierra. Aquí es donde entran en juego las estrategias de debug y optimización.

Optimizando la resolución

if(i == 8 && j == 8){
	return true;
}

Este podría ser uno de los posibles ajustes que podríamos hacer. Cuando llegamos a la última celda y es válida, simplemente devolvemos verdadero. Esto significa que hemos encontrado una solución y podemos detenernos.

int ni = 0;
int nj = j+1;
if (nj > 8) {
	ni = i+1;
	nj = 0;
}

Otro cambio podría ser la forma en que nos movemos a través del tablero. En lugar de ir de izquierda a derecha y de arriba a abajo, podemos intentar un enfoque más diagonal, lo que podría ayudarnos a evitar algún punto muerto.

En conclusión, aunque la resolución de Sudoku en Java puede parecer un tema desalentador al principio, con el enfoque correcto y una comprensión sólida de la lógica y los algoritmos subyacentes, puede transformarse en una misión factible y altamente educativa. El camino puede estar lleno de bucles sin fin y errores inesperados, pero con cada problema superado, se obtiene una valiosa lección de optimización, depuración y, lo más importante, tenacidad.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad