Beispiel #1
0
 public Node(RowHeader r, ColumnHeader c)
 {
     row    = r;
     column = c;
 }
Beispiel #2
0
        public bool DLSolve()
        {
            if (columns.Count == 0)
            {
                return(true);
            }

            //MessageBox.Show("Rows: " + rows.Count.ToString() + "\nConstraints: " + columns.Count);

            int minCount = columns.Min(x => x.memberCount);

            if (minCount == 0)
            {
                return(false);
            }


            ColumnHeader     currentColumn = columns.Where(x => x.memberCount == minCount).ToArray()[0];
            List <RowHeader> rowsToChoose  = new List <RowHeader>();

            Node curNode = currentColumn.firstNode;

            do
            {
                rowsToChoose.Add(curNode.row);
                curNode = curNode.down;
            } while (curNode != currentColumn.firstNode);


            while (rowsToChoose.Count > 0)
            {
                int colBefore = columns.Count;
                int rowBefore = rows.Count;

                RowHeader currentRow = chooseRow(rowsToChoose);
                if (rowsToChoose.Contains(currentRow))
                {
                    rowsToChoose.Remove(currentRow);

                    Node columnNode = currentRow.firstNode; //Indexes the column we're working on

                    partialSolution.Add(currentRow);

                    do
                    {
                        constraintRemove(columnNode.column);
                        columnNode = columnNode.right;
                    } while (columnNode != currentRow.firstNode);

                    if (DLSolve())
                    {
                        return(true);
                    }
                    else
                    {
                        //Reverse the above process.

                        columnNode = currentRow.firstNode; //Indexes the column we're working on
                        partialSolution.Remove(currentRow);

                        do
                        {
                            constraintAdd(columnNode.column);
                            columnNode = columnNode.right;
                        } while (columnNode != currentRow.firstNode);

                        if (columns.Count != colBefore)
                        {
                            throw new Exception();
                        }
                        if (rows.Count != rowBefore)
                        {
                            throw new Exception();
                        }
                    }
                }
            }


            return(false);
        }