Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Curi0s0 en 12 Junio 2018, 17:36 pm



Título: Ayuda con este código del juego Sodoku
Publicado por: Curi0s0 en 12 Junio 2018, 17:36 pm
Buenos días, si alguien me puede dar una sugerencia o donde esta fallando el código, por que aveces me muestra resultado y otras veces no me muestra nada. Bueno si me los muestra pero no de la forma que tenía en mente. Lo que trato de hacer es básicamente generar números aleatorios [1-9], de tal manera que no se repitan ni en la fila ni en la columna. Por le momento solo quiero que haga eso el código. Ya que le falta implementar al código una tercera condición o regla. Mas abajo les dejo  los resultados que me genera el código, uno donde me muestra el resultado como debería de ser, y en la otra un tanto raro.
Aclaro que no llevo mucho tiempo programando y desde hace poco me estoy iniciando en el mundo de la programación. Desde ya Gracias por sus sugerencias o ayuda que me puedan brindar.
Aquí el código.


package Sodoku;

public class Sodoku {

   public static void main(String[] args)
   {
      String caracter;
      int[][] V=new int[9][9];
      int m;
      int k;
      int i, j;
      
      for(i=0; i<3; i++)//Lo puse en 3 nomas para ver su funcionamiento de "i".
      {
         System.out.println(i);//Para ver que valor me toma i.Como aveces  me muestra el resultado y otras veces no, quería ver el funcionamineto  de "i".
         j=0;
         while(j<9)
         {
            System.out.println(j); //Solo para ver que valor toma j. Como aveces  me muestra el resultado y otras veces no, quería ver el funcionamiento  de  "j
            V[j]=(int)(Math.random()*9)+1;
            //Esta instrucción solo está, por que quería ver que valores me generaba el random.
            System.out.println("["+i+"]["+j+"]: "+V[j]);
            
            caracter="a";
            //Con este for avanzo una posición en la fila con respecto a la ubicación de la posición actual.
            for( k=0; k<j && caracter=="a"; k++)
            {
               /*Compara el valor generado por random con los valores que se encuentran antes y que están en esa fila. Si entra al if. significa que el valor generado por random coincide con otro valor de esa fila por lo
 cual la variable caracter cambia de valor, por lo que sale del for,y vuelve al inicio de while para generar un nuevo valor en la misma posicion con random.*/
               if(V[j]==V[k])
               {
                  
                  caracter="b";
               }         
            }
            /*Si entra a este if, significa que el valor generado por random no coincidió con ninguno de los valores
              en la fila donde se ubica*/
            if(caracter=="a")
            {
               //Con este for avanzo una posición en la columna con respecto a la ubicación de la posición actual.
               for(m=0;m<i && caracter=="a";m++)
               {
                  /*Empieza a Comparar el valor generado por random con los valores que se encuentran antes y que están en esa columna. Si en algún momento entra al if, sale del
                  for, por lo que vuelve al inicio de while para generar un nuevo valor en la misma posición*/
                  if(V[j]==V[m][j])
                  {
                     
                     caracter="b";
                  }
               }
               /*Si caracter es igual a "a" quiere decir que nunca entró a los if anteriores,por lo que "j" sube en 1, para nuevamente generar un nuevo valor con random en la nueva posición*/
               if(caracter=="a")
               {
                  j++;
               }
            }
         }         
      }
            
      
      
      for(i=0; i<9; i++)
      {
         for(j=0; j<9; j++)
         {
            System.out.print(V[j] + " ");
         }
         System.out.println();
         
      }
      
   }
   
}


Aquí los resultados:
Resultado como debería de ser.
Este resultado es por los que imprime las posiciones de "i" i "j", como ambos los inicié en cero, entonces comienzan con el valor de cero, y con random los valores que me genera en cada posición.

0
0
[ 0][0]: 8
1
[ 0][1]: 9
2
[ 0][2]: 1
3
[ 0][3]: 3
4
[ 0][4]: 6
5
[ 0][5]: 6
5
[ 0][5]: 7
6
[ 0][6]: 9
6
[ 0][6]: 2
7
[ 0][7]: 7
7
[ 0][7]: 6
7
[ 0][7]: 7
.
.
.continua...

Al final el resultado es:
8 9 1 3 6 7 2 4 5
1 2 6 8 9 5 4 3 7
4 1 7 2 5 9 6 8 3
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0


Resultado un tanto raro:
Aquí mi pregunta es: ¿Por que el "i" toma el valor de 2 y "j" el valor de 8?
Si a ambos los inicié con el valor de ceros; pero de frente toman esos valores mencionados. este resultado no se detiene, tengo que darle a detener manualmente.

[2][8]: 7
8
[2][8]: 8
8
[2][8]: 4
8
[2][8]: 2
8
[2][8]: 7
8
[2][8]: 8
8
[2][8]: 9
8
[2][8]: 6
8
[2][8]: 2
8
.
.
. continua


Título: Re: Ayuda con este código del juego Sodoku
Publicado por: Curi0s0 en 14 Junio 2018, 03:26 am
Bueno Amigos, ya resolví el problema que tenía y también ya terminé de implementar el código :) :). Solo que demora en sacar el resultado final.

package Sodoku;

public class Sodoku {

   public static void main(String[] args)
   {
      String caracter="a";
      int[][] V=new int[9][9];
      int m;
      int k;
      int i, j;
      int x=0,y=0;
      
      
      for(i=0; i<9 ; i++)
      {
         for(j=0; j<9; j++)
         {
            caracter="a";
            V[j]=(int)(Math.random()*9)+1;
            if(i<3 && j<3)
            {
               x=0;
               y=0;
            }
            else if(i<3 && j<6)
            {
               x=0;
               y=3;
            }
            else if(i<3 && j<9)
            {
               x=0;
               y=6;
            }
            else if(i<6 && j<3)
            {
               x=3;
               y=0;
            }
            else if(i<6 && j<6)
            {
               x=3;
               y=3;
            }
            else if(i<6 && j<9)
            {
               x=3;
               y=6;
            }
            else if(i<9 && j<3)
            {
               x=6;
               y=0;
            }
            else if(i<9 && j<6)
            {
               x=6;
               y=3;
            }
            else if(i<9 && j<9)
            {
               x=6;
               y=6;
            }
               
               
            for(m=x; m<x+3; m++)
            {
               for(int n=y; n<y+3; n++)
               {
                  if(i==m && j==n)
                  {
                     caracter="c";
                     break;
                  }
                  else if(V[j] == V[m][n])
                  {
                     caracter="b";
                     break;
                  }
               }
               if(caracter=="c")
               {
                  break;
               }
               else if(caracter=="b")
               {
                  j=-1;
                  break;
               }
            }                  
               
            if(caracter=="c")
            {
               for( k=0; k<j && caracter=="c"; k++)
               {
                  if(V[j]==V[k])
                  {            
                     caracter="b";
                  }         
               }
               if(caracter=="b")
               {
                  i--;
                  break;
               }
            }
            
            if(caracter=="c")
            {
               for(m=0;m<i && caracter=="c";m++)
               {
                  if(V[j]==V[m][j])
                  {
                     caracter="b";
                  }
               }
            }
               
            if(caracter=="b")
            {
               i--;
               break;
            }   
         }
      }
      
      for(i=0; i<9; i++)
      {
         if(i%3==0 && i!=0)
         {
            System.out.println();
         }
         for(j=0; j<9; j++)
         {
            if(j%3==0 && j!=0)
            {
               System.out.print(" ");
            }
            System.out.print(V[j] + " ");   
         }   
         System.out.println();
      }
   }
}

Resultados

1er Resultado
8 4 2  3 7 1  5 9 6
9 6 7  2 4 5  1 3 8
3 5 1  8 9 6  7 2 4

1 8 4  9 2 3  6 5 7
2 7 5  1 6 8  3 4 9
6 9 3  7 5 4  2 8 1

4 3 6  5 8 7  9 1 2
5 2 8  6 1 9  4 7 3
7 1 9  4 3 2  8 6 5

2do Resultado
1 8 5  4 3 9  7 2 6
2 9 7  1 6 5  3 8 4
6 3 4  7 2 8  5 1 9

7 2 9  6 1 3  4 5 8
3 6 8  5 4 2  9 7 1
4 5 1  8 9 7  6 3 2

9 4 2  3 7 1  8 6 5
5 1 3  9 8 6  2 4 7
8 7 6  2 5 4  1 9 3


Título: Re: Ayuda con este código del juego Sodoku
Publicado por: Curi0s0 en 14 Junio 2018, 03:36 am
En las partes donde esta V[j]  es V[ i][j]  ,, raro que no se haya copiado esa parte xd


Título: Re: Ayuda con este código del juego Sodoku
Publicado por: Serapis en 14 Junio 2018, 22:19 pm
En el siguiente hilo, el año pasado, traté el problema de los sudokus a fondo...

https://foro.elhacker.net/java/codigo_para_crear_sudokus-t472924.0.html

Sin compilar, en mi viejo tablet, generar un sudoku al azar, demoraba menos de 1 segundo...