Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con programa que resuelva el problema del Caballo usando heurística

Estas en el tema de Problema con programa que resuelva el problema del Caballo usando heurística en el foro de C/C++ en Foros del Web. Bueno, este es un programa que intenta resolver el problema del caballo (haciendo pasar un caballo en un tablero de ajedrez por todas las casillas ...
  #1 (permalink)  
Antiguo 08/12/2012, 06:10
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Pregunta Problema con programa que resuelva el problema del Caballo usando heurística

Bueno, este es un programa que intenta resolver el problema del caballo (haciendo pasar un caballo en un tablero de ajedrez por todas las casillas sin repetir ninguna), usando heurística de accesibilidad, o sea, revisando (mediante un arreglo) qué movimiento conviene más hacer (calculando después de cada movimiento la accesibilidad de las casillas, o sea, desde cuantas posiciones se puede llegar a ellas).

Les dejo el programa, por alguna razón que aún no he encontrado, no entra en el ciclo while de la línea 34... les agradecería muchísimo su ayuda.

Código C++:
Ver original
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4.  
  5. #include <iomanip>
  6. using std::setw;
  7.  
  8. int heuristica(int, int, const int[][8], const int[][8]);
  9. void modificarHeuristica(const int[][8], int[][8]);
  10.  
  11. int main()
  12. {
  13.   int movimiento;
  14.   int horizontal[] = {2, 1, -1, -2, -2, -1, 1, 2};
  15.   int vertical[] = {-1, -2, -2, -1, 1, 2, 2, 1};
  16.   int tablero[8][8] = {{},{}};
  17.   int accesibilidad[8][8] = {{2, 3, 4, 4, 4, 4, 5, 2},
  18.                  {3, 4, 6, 6, 6, 6, 4, 3},
  19.                  {4, 6, 8, 8, 8, 8, 6, 4},
  20.                  {4, 6, 8, 8, 8, 8, 6, 4},
  21.                  {4, 6, 8, 8, 8, 8, 6, 4},
  22.                  {4, 6, 8, 8, 8, 8, 6, 4},
  23.                  {3, 4, 6, 6, 6, 6, 4, 3},
  24.                  {2, 3, 4, 4, 4, 4, 5, 2}};
  25.  
  26.   int filaActual = 3;
  27.   int columnaActual = 4;
  28.   int pasos = 2;
  29.  
  30.   tablero[filaActual][columnaActual] = 1;
  31.  
  32.   modificarHeuristica(tablero, accesibilidad);
  33.  
  34.   while(heuristica(filaActual, columnaActual, tablero, accesibilidad) != -1)
  35.   {
  36.     movimiento = heuristica(filaActual, columnaActual, tablero, accesibilidad);
  37.     filaActual += vertical[movimiento];
  38.     columnaActual += horizontal[movimiento];
  39.     tablero[filaActual][columnaActual] = pasos;
  40.     modificarHeuristica(tablero, accesibilidad);
  41.     pasos++;
  42.   }
  43.  
  44.   for(int x = 0; x < 8; x++)
  45.   {
  46.     for(int y = 0; y < 8; y++)
  47.     {
  48.       cout << setw(3) << tablero[x][y];
  49.     }
  50.     cout << endl;
  51.   }
  52.   cout << endl;
  53.   return 0;
  54. }
  55.  
  56. void modificarHeuristica(const int tablero[][8], int nuevo[][8])
  57. {
  58.   for(int x = 0; x < 8; x++)
  59.   {
  60.     int movimientos = 0;
  61.    
  62.     for(int y = 0; y < 8; y++)
  63.     {
  64.       if((x - 1 > -1) && (x - 1 < 8) && (y + 2 > -1) && (y + 2 < 8) && (tablero[x-1][y+2] == 0))
  65.     movimientos++;
  66.       if((x - 2 > -1) && (x - 2 < 8) && (y + 1 > -1) && (y + 1 < 8) && (tablero[x-2][y+1] == 0))
  67.     movimientos++;
  68.       if((x - 2 > -1) && (x - 2 < 8) && (y - 1 > -1) && (y - 1 < 8) && (tablero[x-2][y-1] == 0))
  69.     movimientos++;
  70.       if((x - 1 > -1) && (x - 1 < 8) && (y - 2 > -1) && (y - 2 < 8) && (tablero[x-1][y-2] == 0))
  71.     movimientos++;
  72.       if((x + 1 > -1) && (x + 1 < 8) && (y - 2 > -1) && (y - 2 < 8) && (tablero[x+1][y-2] == 0))
  73.     movimientos++;
  74.       if((x + 2 > -1) && (x + 2 < 8) && (y - 1 > -1) && (y - 1 < 8) && (tablero[x+2][y-1] == 0))
  75.     movimientos++;
  76.       if((x + 2 > -1) && (x + 2 < 8) && (y + 1 > -1) && (y + 1 < 8) && (tablero[x+2][y+1] == 0))
  77.     movimientos++;
  78.       if((x + 1 > -1) && (x + 1 < 8) && (y + 2 > -1) && (y + 2 < 8) && (tablero[x+1][y+2] == 0))
  79.     movimientos++;
  80.      
  81.       nuevo[x][y] = movimientos;
  82.     }
  83.   }
  84. }
  85.  
  86. int heuristica(int x, int y, const int tablero[][8], const int tableroH[][8])
  87. {
  88.   int menor = 10;
  89.  
  90.     if((x - 1 > -1) && (x - 1 < 8) && (y + 2 > -1) && (y + 2 < 8) && (tablero[x-1][y+2] == 0))
  91.       if(tableroH[x-1][y+2] < menor)
  92.     menor = 0;
  93.     if((x - 2 > -1) && (x - 2 < 8) && (y + 1 > -1) && (y + 1 < 8) && (tablero[x-2][y+1] == 0))
  94.       if(tableroH[x-2][y+1] < menor)
  95.     menor = 1;
  96.     if((x - 2 > -1) && (x - 2 < 8) && (y - 1 > -1) && (y - 1 < 8) && (tablero[x-2][y-1] == 0))
  97.       if(tableroH[x-2][y-1] < menor)
  98.     menor = 2;
  99.     if((x - 1 > -1) && (x - 1 < 8) && (y - 2 > -1) && (y - 2 < 8) && (tablero[x-1][y-2] == 0))
  100.       if(tableroH[x-1][y-2] < menor)
  101.     menor = 3;
  102.     if((x + 1 > -1) && (x + 1 < 8) && (y - 2 > -1) && (y - 2 < 8) && (tablero[x+1][y-2] == 0))
  103.       if(tableroH[x+1][y-2] < menor)
  104.     menor = 4;
  105.     if((x + 2 > -1) && (x + 2 < 8) && (y - 1 > -1) && (y - 1 < 8) && (tablero[x+2][y-1] == 0))
  106.       if(tableroH[x+2][y-1] < menor)
  107.     menor = 5;
  108.     if((x + 2 > -1) && (x + 2 < 8) && (y + 1 > -1) && (y + 1 < 8) && (tablero[x+2][y+1] == 0))
  109.       if(tableroH[x+2][y+1] < menor)
  110.     menor = 6;
  111.     if((x + 1 > -1) && (x + 1 < 8) && (y + 2 > -1) && (y + 2 < 8) && (tablero[x+1][y+2] == 0))
  112.       if(tableroH[x+1][y+2] < menor)
  113.     menor = 7;
  114.    
  115.     if(menor == 10)
  116.       return -1;
  117.     else
  118.       return menor;    
  119. }

Saludos;
  #2 (permalink)  
Antiguo 08/12/2012, 07:55
Avatar de cotolon  
Fecha de Ingreso: octubre-2012
Mensajes: 55
Antigüedad: 11 años, 6 meses
Puntos: 10
Respuesta: Problema con programa que resuelva el problema del Caballo usando heurísti

Y si lo depuras?

o colocas algo así como cout << menor; cout << x; cout << y;

y esas cosas para saber cuanto valen y vas viendo
  #3 (permalink)  
Antiguo 08/12/2012, 09:18
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Respuesta: Problema con programa que resuelva el problema del Caballo usando heurísti

Uso KDevelop y no le entiendo muy bien al depurador, sólo aparece un espacio en blanco con las mismas salidas que da el ejecutarlo, y al final "Exit succesful", pues sí, iré probando más couts, que poniendo uno en el while descubrí que nunca entraba en el ciclo.

Saludos :)
  #4 (permalink)  
Antiguo 08/12/2012, 15:48
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Respuesta: Problema con programa que resuelva el problema del Caballo usando heurísti

Problema arreglado, sólo tenía que incluir:

movimientos = 0; después de la línea 81, y yo rompiéndome la cabeza xD

Saludos.
  #5 (permalink)  
Antiguo 10/12/2012, 06:49
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 15 años, 8 meses
Puntos: 6
Respuesta: Problema con programa que resuelva el problema del Caballo usando heurísti

Hola,

te recomiendo que para depurar el programa uses el editor Emacs y actives la opción gdb-many-windows, que aporta muchísima información. Yo también uso Kdevelop para programar (funciona de maravilla), pero lo compagino con Emacs para depurar mis programas.

Etiquetas: int, programa, usando
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:12.