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.