#include <iostream>
#include <vector>
#include <list>
using namespace std;
void printQueenResult(int size, vector<int> result) {
for (size_t row = 0; row < size; ++row)
{
for (size_t column = 0; column < size; ++column)
{
if (result[row] == column)
{
cout << "X";
}
else {
cout << "O";
}
}
cout << endl;
}
cout << endl;
}
bool isValid(int size, vector<int> &result, int row, int column) {
int leftUp = column - 1;
int rightUp = column + 1;
for (int r = row - 1; r >= 0; --r)
{
if(result[r] == column)
{
return false;
}
if (leftUp >= 0 && result[r] == leftUp)
{
return false;
}
if (rightUp < size && result[r] == rightUp )
{
return false;
}
--leftUp;
++rightUp;
}
return true;
}
void queen(int size, int row, int &count, vector<int> &result, list<vector<int> > &results) {
if (size == row) {
++count;
results.push_back(vector<int>(result));
return;
}
for (size_t column = 0; column < size; ++column)
{
if (isValid(size, result, row, column))
{
result[row] = column;
queen(size, row + 1, count, result, results);
}
}
}
int main() {
int size = 0;
while (true)
{
cout << "Please enter the size of queen problem:" << endl;
cin >> size;
if (size <= 0)
{
cout << "Exit" << endl;
break;
}
vector<int> result(size, 0);
list<vector<int> > results;
int count = 0;
queen(size, 0, count, result, results);
cout << "We have " << count << " methods." << endl;
for (list<vector<int> >::iterator i = results.begin();
i != results.end(); ++i)
{
printQueenResult(size, *i);
}
}
}