Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Legnak en 29 Noviembre 2012, 19:53 pm



Título: ayuda con unos algoritmos de mi SUDOKU en Java :D
Publicado por: Legnak en 29 Noviembre 2012, 19:53 pm
Hola foreros, he estado haciendo un proyecto que me mandaron de la universidad; un SUDOKU, la verdad ya lo tengo casi terminado, sólo que tengo un gran problema de lógica, he creado funciones para generar las pistas del SUDOKU, para chequear si un número se encuentra en fila o columna y para chequear si se encuentra en un cuadrante, todo funciona de maravilla, le he agregado una función para un nuevo botón llamado "rendirse" y la función que cumple es rellenar las casillas del SUDOKU faltantes y corregir las existentes que no sean parte de las pistas que se cargaron en un principio, el algoritmo me funciona correctamente, sólo que a la hora de cargar la función quedan varias casillas trancadas; es decir, no hay forma de poner ningún número del 1 al 9 porque o está en fila o columna o está en cuadrante y como el valor de la función que busca el valor correcto se inicializa en 0, queda en 0 y ese es el valor que pone,
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:
(http://4.imgland.net/FOScb4.png) 

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;
así genera las pistas:
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!