elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  ayuda con unos algoritmos de mi SUDOKU en Java :D
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con unos algoritmos de mi SUDOKU en Java :D  (Leído 5,046 veces)
Legnak

Desconectado Desconectado

Mensajes: 61


("Programador");


Ver Perfil
ayuda con unos algoritmos de mi SUDOKU en Java :D
« 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:
 

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!
       


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda - Algoritmo Sudoku
Programación Visual Basic
VonN 8 6,631 Último mensaje 11 Julio 2009, 02:35 am
por h0oke
ayuda con algoritmos =(
Dudas Generales
vizarcloud 9 5,433 Último mensaje 8 Junio 2010, 01:25 am
por winroot
Algoritmos y Estructuras de Datos Ejercicios Resueltos y Teoría (Java)
Java
F1X3R 2 31,176 Último mensaje 25 Julio 2010, 02:27 am
por Aeros
Algoritmos de planificacion en Java
Java
lina_margatira 7 20,078 Último mensaje 12 Noviembre 2010, 14:39 pm
por segundo.ocas
Ejercicio de sudoku en java
Ejercicios
mz39720 3 4,306 Último mensaje 22 Noviembre 2017, 17:53 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines