Example #1
0
        /// <summary>Find a solution to the problem.</summary>
        /// <param name="partial">
        /// a temporary datastructure to keep the current partial
        /// answer in
        /// </param>
        /// <param name="output">the acceptor for the results that are found</param>
        /// <returns>the number of solutions found</returns>
        private int Search(IList <DancingLinks.Node <ColumnName> > partial, DancingLinks.SolutionAcceptor
                           <ColumnName> output)
        {
            int results = 0;

            if (head.right == head)
            {
                IList <IList <ColumnName> > result = new AList <IList <ColumnName> >(partial.Count);
                foreach (DancingLinks.Node <ColumnName> row in partial)
                {
                    result.AddItem(GetRowName(row));
                }
                output.Solution(result);
                results += 1;
            }
            else
            {
                DancingLinks.ColumnHeader <ColumnName> col = FindBestColumn();
                if (col.size > 0)
                {
                    CoverColumn(col);
                    DancingLinks.Node <ColumnName> row = col.down;
                    while (row != col)
                    {
                        partial.AddItem(row);
                        DancingLinks.Node <ColumnName> node = row.right;
                        while (node != row)
                        {
                            CoverColumn(node.head);
                            node = node.right;
                        }
                        results += Search(partial, output);
                        partial.Remove(partial.Count - 1);
                        node = row.left;
                        while (node != row)
                        {
                            UncoverColumn(node.head);
                            node = node.left;
                        }
                        row = row.down;
                    }
                    UncoverColumn(col);
                }
            }
            return(results);
        }