sigo avanzando con mi programa.
He creado un metodo recursivo que solucione el sudoku desde donde lo dejo con "mi metodo" (es decir pongo todos los numeros faciles y luego uso fuerza bruta).
Este es el codigo, solo pongo el metodo porque lo demas es exactamente igual, no lo he tocado
Código:
/**
* Algotirmo recursivo para la solucion del sudoku. Se aplica despues de intentar solucionarlo del otro modo.
* @param fila donde vamos a intentar colocar el numero
* @param columna donde vamos a intentar colocar el numero
*/
//Debemos usar otro tablero para guardarlo como base. Se llamara tableroParcial
public boolean solve(int fila, int columna)
{
boolean repetido;
for (int i = 1; i < 10; i++)
{
//comprobamos que donde vayamos a colocar no haya un numero ya fijo
// Si lo hay, pasamos a la siguiente casilla
if (tableroParcial[fila][columna] != 0)
{
if (columna <8)
columna++;
else
{
columna = 0;
fila++;
}
if (solve(fila, columna) )
{
return true;
}
else return false;
}
//si no es uno fijo de tableroParcial procedemos a ver si se puede colocar
else
{
String numero = i + "";
tablero[fila][columna].setText(numero);
repetido = verificarColumna(fila,columna) || verificarFila(fila, columna) || verificarCuadrado(fila, columna);
if ( !repetido )
{
// int valor = tableroAux[fila][columna];
tableroAux[fila][columna]= i;
if (puestos < 81)
{
puestos++;
System.out.print(puestos);
if (columna <8)
columna++;
else
{
columna = 0;
fila++;
}
if (solve(fila, columna) )
{
return true;
}
else
{
tableroAux[fila][columna] = tableroParcial[fila][columna];
puestos--;
System.out.print("a");
}
}
else
return true;
}
else
{
numero = 0 + "";
tablero[fila][columna].setText(numero);
}
}
}
return false;
}
El problema es que mi codigo NO FUNCIONA. Os explico:
es un metodo backtracking, es decir coloca numero a numero hasta dar con la solucion, desde la casilla (0,0) a la (8,8), recordemos que son indices de java.
El fallo lo produce cuando no puede colocar ningun numero en una casilla (exactamente cuando coloca el numero 54, podeis verlo en la consola, es el [2][5] hace un return false y desde hay va hacia atras, no consigo que funcione y vuelva a hacer cambios hacia delante.
Si veis el codigo, nada mas empezar hay una pequeña criba para no poner numeros en las casillas donde tableroParcial ya tenga, que es una matrix que tenia el valor inicial de la matriz antes del back.
podeis bajaros el codigo completo y el sudoku que estoy usando de aqui:
http://www.megaupload.com/?d=FRBOC4AW
Ruego una ayudita, que llegan las vacaiones y no quiero irme con la espinita clavada de que he fallado al crear un programa.