Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/01/2015, 00:37
Avatar de Aleinshir
Aleinshir
 
Fecha de Ingreso: diciembre-2014
Mensajes: 14
Antigüedad: 9 años, 4 meses
Puntos: 0
Pregunta recorrido caballo

hola estoy haciendo el recorrido del caballo en java es una clase que se encarga de crear el array terminado luego lo retorna y la interfaz que hare en jframe lo representara primero lo quise hacer con fuerza bruta pero no carga es un error logico o es por la propia caracteristica de java ya que hice uno parecido "parecido" en c y lo saca en un santiamen se nota tanto la dif entre java y c mi duda es mas sobre ello el codigo luego lo puedo optimizar este es el codigo
Código Java:
Ver original
  1. package tableroajedrez.caballo;
  2.  
  3. import java.util.Random;
  4.  
  5. /**
  6.  *
  7.  * @author aleinshir
  8.  */
  9. public class Kernel {
  10.    
  11.     private int Tablero[][];                                                        // Tablero de ajedre representado en una matriz
  12.     private static int horizontal[] = new int[] {  2,  1, -1, -2, -2, -1, 1, 2 };                       // Movimientos posibles de manera horizonta
  13.     private static int vertical[] = new int[]      { -1, -2, -2, -1,  1,  2, 2, 1 };                        // Movimientos posibles de manera vertical
  14.     private int movimientos;                                                        // Movimientos realizados
  15.     private boolean aux_mov;                                                        // Auxiliar de prueba
  16.     private int prueba;                                                         // Variable para probar todos los movimientos
  17.     private boolean auxiliar;                                                       // Auxiliar para saber si se soluciono el problema
  18.     private int siguiente_mov;                                                      // Siguiente movimiento que hara el caballo
  19.     private int errores;                                                            // Se asegura que el caballo no este atrapado
  20.     private Random rand;                                                        // Numero aleatorio
  21.     private boolean auxiliar_ex;
  22.     private boolean auxiliar_listo;
  23.     private int numero;
  24.     /**
  25.      * Inicializa el tablero y randomiza la clase "Random".
  26.      */
  27.     public Kernel() {
  28.         this.Tablero = new int[8][8];
  29.         rand = new Random(System.nanoTime());
  30.         construir_array();
  31.     }
  32.    
  33.     /**
  34.      *
  35.      * Clase que inicial el kernel para determina el final del problema.
  36.      *
  37.      * @param posicionH Posicion inicial vertical
  38.      * @param posicionV Posicion inicial vertical
  39.      * @return El tablero ya resuelto
  40.      */
  41.     @SuppressWarnings("empty-statement")
  42.     public int [][] start(int posicionH, int posicionV) {
  43.         do
  44.             auxiliar_listo =  recorrido_completo(posicionH, posicionV);
  45.         while (auxiliar_listo == false);
  46.         return Tablero;
  47.     }
  48.    
  49.     /**
  50.      *
  51.      * @return True si esta completo el recorrido
  52.      */
  53.     private  boolean recorrido_completo(int posicionH, int posicionV) {
  54.        
  55.         auxiliar = true;
  56.         for (movimientos = 1, errores = 0; movimientos <= 64 && auxiliar; movimientos++)    // Ciclo exterior
  57.         {
  58.             aux_mov = true;
  59.             siguiente_mov = rand.nextInt(8);                                        // Determina el proximo movimiento
  60.             for (prueba = 0; prueba < 8 && aux_mov; prueba++, siguiente_mov++, errores++)// Prueba todos los posibles movimientos
  61.             {
  62.                
  63.                 if (siguiente_mov == 8)                                         // Pasa al movimento 0 cuando llega al 8
  64.                     siguiente_mov = 0;
  65.                
  66.                 try
  67.                 {
  68.                     if (Tablero[posicionH + horizontal[siguiente_mov]][posicionV + vertical[siguiente_mov]] == 0)
  69.                     {
  70.                         Tablero[posicionH][posicionV] = movimientos;
  71.                        
  72.                         errores = 0;
  73.                         aux_mov = false;
  74.                         posicionV += vertical[siguiente_mov] ;
  75.                         posicionH += horizontal[siguiente_mov] ;
  76.                     }
  77.                 }
  78.                 catch(ArrayIndexOutOfBoundsException e)
  79.                 {
  80.                    
  81.                 }
  82.             }
  83.            
  84.             if (errores >= 8)                                                   // Si hay mas de 8 errores corta el recorrido
  85.                 auxiliar =false;
  86.         }
  87.        
  88.         return movimientos >= 64;                                               // True si hizo los 64 movimiento
  89.     }
  90.    
  91.     /**
  92.      *
  93.      * Construye el array dandole 0 (no necesario en java pero es mejor inicializarlo.
  94.      */
  95.     private void construir_array() {
  96.         for (int i = 0; i < 8; i++)
  97.         {
  98.             for (int j = 0; j < 8; j++)
  99.             {
  100.                 Tablero[i][j] = 0;
  101.             }
  102.         }
  103.     }
  104. }

use un manejo de excepciones trate de hacerlo asi porque era mas "estetico"
por cierto este es el de c

Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4.  
  5. #define TAMANIOV 12                                     // Altura del tablero
  6. #define TAMANIOH 12                                     // Anchura del tablero
  7.  
  8. int despliega_tablero(const int tablero[][TAMANIOV]);
  9. int llamar(int posicionH, int posicionV, int intento);
  10.  
  11. int main()
  12. {
  13.     srand(time(NULL));
  14.     int posicionH, posicionV;
  15.     scanf("%d%d", &posicionH, &posicionV);
  16.     posicionH += 2;
  17.     posicionV += 2;
  18.     int i, intento = 0;
  19.     for (i = 0; i == 0;)
  20.     {
  21.         intento++;
  22.         if (llamar(posicionH, posicionV, intento) == 1)
  23.         {
  24.             intento = 0;
  25.         }
  26.     }
  27.     system("pause");
  28.     return 0;
  29. }
  30.  
  31. int llamar(int posicionH, int posicionV, int intento)
  32. {
  33.     int Tablero[TAMANIOH][TAMANIOV] = { 0 };
  34.     int horizontal[8] = { 02, 01, -1, -2, -2, -1, 1, 2 };
  35.     int vertical[8] =   { -1, -2, -2, -1, 01, 02, 2, 1 };
  36.     int movimientos, errorlevel, almacenaH, almacenaV;
  37.     int siguiente, fun;
  38.     for  (movimientos = 1, errorlevel = 0; movimientos != 65;)
  39.     {
  40.          siguiente = rand() % 7;
  41.          for (fun = 0; fun < 8; siguiente++, fun++)
  42.          {
  43.              if (siguiente == 8)
  44.                  siguiente = 0;
  45.              if (Tablero[posicionH + horizontal[siguiente]][posicionV + vertical[siguiente]] == 0)
  46.              {
  47.                  errorlevel = 0;
  48.                  Tablero[posicionH][posicionV] = movimientos;
  49.                  almacenaH = posicionH;
  50.                  almacenaV = posicionV;
  51.                  posicionH += horizontal[siguiente];
  52.                  posicionV += vertical[siguiente];
  53.                  if (posicionH == 0 || posicionH == 1 || posicionV == 0 || posicionV == 1)
  54.                  {
  55.                      Tablero[posicionH][posicionV] = 1;
  56.                      posicionH = almacenaH;
  57.                      posicionV = almacenaV;
  58.                      continue;
  59.                  }
  60.  
  61.                  if (posicionH == 10 || posicionH == 11 || posicionV == 10 || posicionV == 11)
  62.                  {
  63.                      Tablero[posicionH][posicionV] = 1;
  64.                      posicionH = almacenaH;
  65.                      posicionV = almacenaV;
  66.                      continue;
  67.                  }
  68.                  movimientos++;
  69.                  break;
  70.              }
  71.          }
  72.         errorlevel++;
  73.         if (errorlevel >= 8)
  74.            break;
  75.  
  76.     }
  77.  
  78.     if (movimientos >= 64)
  79.     {
  80.         system("cls");
  81.         despliega_tablero(Tablero);
  82.         printf("movimientos = %d\nintentos = %d\n", movimientos, intento);
  83.         system("pause");
  84.         return 1;
  85.     }
  86.     else
  87.     {
  88.         return 0;
  89.     }
  90.  
  91.  
  92. }
  93.  
  94. int despliega_tablero(const int tablero[][TAMANIOV])
  95. {
  96.      int columna, fila;
  97.      for (columna = 2; columna < 10; columna++)
  98.      {
  99.          for(fila = 2; fila < 10; fila++)
  100.          {
  101.                   if( tablero[columna][fila] == 0)
  102.                       printf("%3s", "0" );
  103.                   if(tablero[columna][fila] != 0)
  104.                       printf("%3d", tablero[columna][fila]);
  105.          }
  106.          printf("\n");
  107.      
  108.      }
  109.      return 0;
  110. }

//**
como ven arregle el problema usando un array mas grande (12x12) el cual daba para un margen de "error" luego pense que podia usar la posicion si esta era menor que 0 no lo ejecutaba y si era mayor que 7 igual pero como ya habia implementado aquel ah y tambien pense que quizas funcionaria aprobechandome del desplazamiento de c (eso de que un array de 8x8 i[8][0] si le quitas 2 a 0 este se transforma en i[7][6] pero no me gusto (ademas que en java no se puede) gracias de adelantado
PD: si quieren ignoran todo despues del //** ya que no tiene que ver a mi pregunta :D
PD de la PD: seguro algunos me dicen que es malo usar break por eso de la programacion estructurada etc pero cuando hice el code no lo sabia xd y me dio lala corregirlo en java si use una variable de "escape"