public Node(RowHeader r, ColumnHeader c) { row = r; column = c; }
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); }