public QueenList GetSolution(ushort numberOfQueens)
        {
            Queen  queen = null;
            Square testSquare;
            ushort rank, column;
            bool   removeLast = false;

            var result = new QueenList();

            bool goodSquare;

            while (result.Count < numberOfQueens)
            {
                queen = removeLast ? result[result.Count - 1] : new Queen(result.ReservedSquares.Select(square => square.Rank));

                do
                {
                    if (removeLast && queen.TriedColumns.Count < numberOfQueens)
                    {
                        rank = queen.Square.Rank;
                    }
                    else
                    {
                        rank = rankProvider.GetNextElement(queen.TriedRanks, numberOfQueens);
                    }

                    if (rank != UInt16.MaxValue)
                    {
                        if (removeLast)
                        {
                            result.RemoveAt(result.Count - 1);
                            removeLast = false;
                        }
                        else
                        {
                            queen.ClearTriedColumns(result.ReservedSquares.Select(square => square.Column));
                        }

                        do
                        {
                            column = columnProvider.GetNextElement(queen.TriedColumns, numberOfQueens);
                            if (column != UInt16.MaxValue)
                            {
                                testSquare = new Square(rank, column);
                                goodSquare = result.IsGoodSquare(testSquare);
                            }
                            else
                            {
                                goodSquare = false;
                                testSquare = null;
                            }
                        }while (ContinueSearch(numberOfQueens, queen.TriedColumns.Count, goodSquare));
                    }
                    else
                    {
                        goodSquare = false;
                        testSquare = null;
                        result.RemoveAt(result.Count - 1);
                    }
                }               while (ContinueSearch(numberOfQueens, queen.TriedRanks.Count, goodSquare));

                if (goodSquare)
                {
                    queen.Square = testSquare;
                    result.Add(queen);
                }
                else
                {
                    removeLast = true;
                }
            }

            return(result);
        }