Bueno, al ejecutarlo sale impreso el "tablero" y la única O (reina) que aparece sale en la esquina superior izquierda... bueno, les dejo el código fuente, a ver si alguien encuentra algún error.
Código C++:
Ver original#include <iostream>
using std::cout;
using std::endl;
int heuristica(int[][8], int&, int&);
bool probar(int, int, int[][8]);
int cuantos(int, int, int[][8]);
void ponerReina(int, int, int[][8]);
int main()
{
int tablero[8][8] = {};
int fila;
int columna;
int a, b;
while(heuristica(tablero, fila, columna) != -1)
{
ponerReina(fila, columna, tablero);
}
for(int x = 0; x < 8; x++)
{
for(int y = 0; y < 8; y++)
{
if(tablero[x][y] == 2)
cout << "O";
else
cout << "X";
}
cout << endl;
}
cout << endl;
return 0;
}
int heuristica(int tablero[][8], int &fila, int &columna)
{
int mejor[] = {-1, 0, 0};
int actual;
for(int x = 0; x < 8; x++)
{
for(int y = 0; y < 8; y++)
{
if(tablero[x][y] == 0)
{
if(probar(x, y, tablero))
{
if(cuantos(x, y, tablero) < mejor[0] || mejor[0] == -1)
{
mejor[0] = cuantos(x, y, tablero);
mejor[1] = x;
mejor[2] = y;
}
}
}
}
}
fila = mejor[1];
columna = mejor[2];
return mejor[0];
}
bool probar(int x, int y, int tablero[][8])
{
int r = x;
int s = y;
if(tablero[x][0] != 0 || tablero[x][1] != 0 || tablero[x][2] != 0 || tablero[x][3] != 0 ||
tablero[x][4] != 0 || tablero[x][5] != 0 || tablero[x][6] != 0 || tablero[x][7] != 0)
return false;
if(tablero[0][y] != 0 || tablero[1][y] != 0 || tablero[2][y] != 0 || tablero[3][y] != 0 ||
tablero[4][y] != 0 || tablero[5][y] != 0 || tablero[6][y] != 0 || tablero[7][y] != 0)
return false;
// Diagonal \ hacia arriba
r--;
s--;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
if(tablero[r][s] != 0)
return false;
r--;
s--;
}
// Diagonal \ hacia abajo
r = x+1;
s = y+1;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
if(tablero[r][s] != 0)
return false;
r++;
s++;
}
// Diagonal / hacia arriba
r = x-1;
s = y+1;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
if(tablero[x][y] != 0)
return false;
r--;
s++;
}
// Diagonal / hacia abajo
r = x+1;
s = y-1;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
if(tablero[x][y] != 0)
return false;
r++;
s--;
}
return true;
}
int cuantos(int x, int y, int tablero[][8])
{
int r = x;
int s = y;
int total = 0;
for(int i = 0; i < 8; i++)
{
if(tablero[x][i] == 0)
total++;
}
for(int i = 0; i < 8; i++)
{
if(tablero[i][y] == 0)
total++;
}
// Diagonal \ hacia arriba
r--;
s--;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
if(tablero[r][s] == 0)
total++;
r--;
s--;
}
// Diagonal \ hacia abajo
r = x+1;
s = y+1;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
if(tablero[r][s] == 0)
total++;
r++;
s++;
}
// Diagonal / hacia arriba
r = x-1;
s = y+1;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
if(tablero[x][y] == 0)
total++;
r--;
s++;
}
// Diagonal / hacia abajo
r = x+1;
s = y-1;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
if(tablero[x][y] == 0)
total++;
r++;
s--;
}
return total-1;
}
void ponerReina(int x, int y, int tablero[][8])
{
int r = x;
int s = y;
tablero[x][y] = 2;
for(int i = 0; i < 8; i++)
{
if(tablero[x][i] == 0)
tablero[x][i] = 1;
}
for(int i = 0; i < 8; i++)
{
if(tablero[i][y] == 0)
tablero[i][y] = 1;
}
// Diagonal \ hacia arriba
r--;
s--;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
tablero[r][s] = 1;
r--;
s--;
}
// Diagonal \ hacia abajo
r = x+1;
s = y+1;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
tablero[r][s] = 1;
r++;
s++;
}
// Diagonal / hacia arriba
r = x-1;
s = y+1;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
tablero[r][s] = 1;
r--;
s++;
}
// Diagonal / hacia abajo
r = x+1;
s = y-1;
while(r >= 0 && r <= 7 && s >= 0 && s <= 7)
{
tablero[r][s] = 1;
r++;
s--;
}
}
Creo que el error está en la función heuristica, pero aún no lo encuentro.
Saludos.