Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/12/2012, 06:10
reethok
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años, 8 meses
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;