#include <iostream>
#include <vector>
size_t count = 0;
void printField( std::vector<unsigned>& field ){
for ( size_t i = 0; i < field.size(); ++i ){
for ( size_t j = 0; j < field.size(); ++j ){
std::cout << ( field.at(j) == i ? "Q ": "- " );
}
std::cout << std::endl;
}
std::cout << std::endl;
}
bool testAll( std::vector<unsigned>& field, unsigned y, unsigned queensSet ){
for( unsigned x = 0; x < queensSet; ++x ){
if( field.at(x) == y //waagerechte Prüfung
||field.at(x) == y-( queensSet - x ) //diagonale Prüfung
|| field.at(x) == y+( queensSet - x ) ){ //diagonale Prüfung
return false;
}
}
return true;
}
//Rekursive Funktion
void setQueenRec( std::vector<unsigned>& field, unsigned queensSet ){
//wenn alle Damen gesetzt wurden
if( queensSet == field.size() ){
++::count;
printField(field);
return;
}
for( unsigned y = 0; y < field.size(); ++y ){
//Test, ob die Dame in der nächsten Reihe gesetzt werden kann
if( testAll( field, y, queensSet ) ) {
field.at( queensSet ) = y;
setQueenRec( field, queensSet+1 );
}
}
}
void setQueen( std::vector<unsigned>& field ){
for( unsigned y = 0; y < field.size(); ++y ){
field.at(0) = y;
//in der erste Reihe werden nacheinander die Damen gesetzt
setQueenRec( field, 1 );
}
}
int main() {
//speichert die Positionen der Damen
std::vector<unsigned> field( 8, 0 );
setQueen( field );
std::cout << "Lösungen insgesamt: " << ::count<< std::endl;
return 0;
}