#include <vector>
#include <iostream>
class Queens
{
int size;
std::vector<int> queens;
bool attacks(int x0, int y0, int x1, int y1)
{
return x0==x1 || y0==y1 || abs(x0-x1)==abs(y0-y1);
}
bool solve(int x=0)
{
if(x==size)
{
printSolution();
return true;
}
for(int y=0; y<size; ++y)
{
bool attacked=false;
// Test that the queen does not attack position (x,y) with any previous queens
for(int x0=0; x0<x; ++x0)
if(attacks(x0,queens[x0],x,y)) { attacked=true; break; }
if(!attacked)
{
queens[x]=y;
if(solve(x+1)) return true;
}
}
return false;
}
void printSolution()
{
for(int y=0; y<size; ++y)
{
for(int x=0; x<size; ++x)
std::cout << (queens[y]==x ? 'Q' : '_');
std::cout << std::endl;
}
}
public:
Queens(int s) : size(s), queens(size)
{
solve();
}
};
int main(int argc, char **argv)
{
int size = argc==2 ? atoi(argv[1]) : 8;
Queens q(size);
return 0;
}