void NQueens(int size, int start_x, int start_y, Stack<Position>& ps, set<set<Position> >& solutions) { if (ps.Size() == size) { set<Position> solution; for (int i = 0; i < size; ++i) { solution.insert(ps.Elements()[i]); } solutions.insert(solution); return; } for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { Position p(i, j); if (!ReachesAny(p, ps)) { int next_x = start_x + 1; int next_y = start_y; if (next_x == size) { next_x = 0; next_y++; } ps.Push(p); NQueens(size, next_x, next_y, ps, solutions); ps.Pop(); } } } }
bool ReachesAny(const Position& p, const Stack<Position>& s) { const Position* elems = s.Elements(); for (int i = 0; i < s.Size(); ++i) { if (p.Reaches(elems[i])) { return true; } } return false; }