Ho sviluppato una classe che esegue quello cha dovrebbe fare il tuo programma (forse è un po' + chiara) e dovrebbe funzionare.
Il problema è che andando avanti casualmente le probabilità di azzeccarla diventano minime!
codice:
#include <iostream>
#include <cstdlib>
using namespace std;
enum stato
{
libero = 0,
occupato = 1,
regina = 2
};
class scacchiera
{
// Matrice della scacchiera
stato m[8][8];
void occupa(int x, int y)
{
unsigned int i,j;
// Occupa la riga
for(i=0; i<8; i++)
m[i][y] = occupato;
// Occupa la colonna
for(j=0; j<8; j++)
m[x][j] = occupato;
// Occupa la diagonale SO - NE
if(x+y < 8) {
i = 0;
j = x+y;
} else {
i = x+y-7;
j = 7;
}
for(; (i<8) && (j>=0);i++, j--)
m[i][j] = occupato;
// Occupa la diagonale NO - SE
if(x>y)
{
i = x-y;
j = 0;
} else {
i = 0;
j = y-x;
}
for(;(i<8) && (j<8);i++, j++)
m[i][j] = occupato;
}
public:
scacchiera()
{
init();
}
void init()
{
for(int i=0; i<8; i++) {
for(int j=0; j<8; j++)
m[i][j] = libero;
}
}
bool imposta_regina(unsigned int x, unsigned int y)
{
if(x>7 || y>7)
{
cout << "Errore!!" << endl;
system("PAUSE");
exit(1);
}
if(m[x][y] == libero)
{
occupa(x,y);
m[x][y] = regina;
return true;
}
// else sottointeso
return false;
}
friend ostream &operator<<(ostream &stream, scacchiera s);
};
ostream &operator<<(ostream &stream, scacchiera s)
{
for(int i=0; i<8; i++)
{
for(int j=0; j<8; j++)
{
stream << s.m[i][j] << ' ';
}
cout << endl;
}
}
int main(int argc, char *argv[])
{
scacchiera a;
int c; unsigned int x,y;
do {
a.init();
c=0;
do {
x = rand() % 8;
y = rand() % 8;
if(a.imposta_regina(x,y))
c++;
else break;
} while(1);
} while(c<8);
cout << a;
return 0;
system("pause");
}
La funzione + importanta è occupa() e contiene quello che mi chiedi.
Ho incluso un main di prova che per il motivo detto prima non da' risultati.