lo que quiero es que me ayuden a mejorar los algoritmos o darme consejos de como podría hacerlo ya que no veo manera de modificar el algoritmo de tal manera que prevenga esa situación, acá les dejo una imagen:
Funciona así: utiliza dos arreglos bidimensional de 9x9, uno para manejar el SUDOKU y otro para saber en que posiciones se crean las pistas.
Código:
int size = 9;
Object load [][]= new Object [size][size];
Object filas [][]= new Object [size][size];
int pistas = 25, total_pistas = 0;
Código:
do
{
f = (int) Math.round((Math.random()*8));
c = (int) Math.round((Math.random()*8));
if (filas[f][c] != null) continue;
valor = getValorCorrecto(filas, f, c);
if (valor != 0)
{
filas[f][c] = valor;
load [f][c] = true;
total_pistas++;
}
} while (total_pistas < pistas);
esta es la función para saber si existe o no en la fila y la columna
Código:
public boolean isInFilayColumna(Object [][] filas, int f, int c, int valor)
{
int j = 0;
boolean duh = false;
for (j = 0; j < 9; j++)
{
if (filas[j][c] == valor || filas[f][j] == valor)
{
duh = true;
break;
}
}
return duh;
}
esta es la función para saber si existe o no en el cuadrante
Código:
public boolean isInCuadrante(Object filas[][], int x, int y, int valor)
{
boolean duh = false;
int startx = 0, starty = 0, endx = 0, endy = 0, i, j;
//COORDENADAS X
if (x >= 0 && x <= 2)
{
startx = 0;
endx = 2;
}
else if (x >= 3 && x <= 5)
{
startx = 3;
endx = 5;
}
else if (x >= 6 && x <= 8)
{
startx = 6;
endx = 8;
}
//COORDENADAS Y
if (y >= 0 && y <=2)
{
starty = 0;
endy = 2;
}
else if (y >= 3 && y <=5)
{
starty = 3;
endy = 5;
}
else if (y >= 6 && y <= 8)
{
starty = 6;
endy = 8;
}
for (i = startx ; i <= endx; i++)
{
for (j = starty; j <= endy; j++)
{
if (filas[i][j] == valor)
{
duh = true;
break;
}
}
}
return duh;
}
y esta es la función que me corrige el SUDOKU
Código:
public void corregir_sudoku(Object filas[][], Object check [][], JTable tabla)
{
int i,j, valor;
valor = 0;
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
if ((filas[i][j] != null && isInFilayColumna(filas, i, j, (int)filas[i][j]) && isInCuadrante(filas, i, j, (int)filas[i][j]) || filas [i][j] == null))
{
valor = getValorCorrecto(filas, i, j);
filas[i][j] = valor;
tabla.setValueAt(valor, i, j);
}
}
}
}
Saludos!