#include <iostream>
#include <queue>
using namespace std;
class Node
{
public:
Node(int n) : t(0), n(n)
{
pos = new int[n + 1];
for (int i = 0; i <= n; ++i)
{
pos[i] = 0;
}
}
Node(const Node& other)
{
t = other.t;
n = other.n;
pos = new int[other.n + 1];
for (int i = 0; i <= n; ++i)
{
pos[i] = other.pos[i];
}
}
~Node()
{
if (pos != NULL)
{
delete[] pos;
pos = NULL;
}
}
bool check(int next);
int t;
int n;
int *pos;
};
bool Node::check(int next)
{
int i;
for (i = 1; i <= t; ++i)
{
int j = pos[i];
if (j == next)
{
return false;
}
if ((next - j) == (i - 1 - t))
{
return false;
}
if ((next - j) == (t + 1 - i))
{
return false;
}
}
return true;
}
class Queen
{
public:
Queen(int x) : n(x), ansNum(0){}
int QueenArrange();
private:
int n;
int ansNum;
};
int Queen::QueenArrange()
{
queue<Node> q;
Node f(n);
q.push(f);
while (!q.empty())
{
Node x = q.front();
q.pop();
if (x.t == n)
{
++ansNum;
}
for (int i = 1; i <= n; ++i)
{
if (x.check(i))
{
Node child(x);
++child.t;
child.pos[child.t] = i;
q.push(child);
}
}
}
return ansNum;
}
int main()
{
int n = 4;
Queen queen(4);
cout << queen.QueenArrange() << endl;
}