This module provides an implementation of the “dancing links” algorhthm to solve the “exact cover” problem.

The “exact cover” problem:

  • Given a set of vectors containing 0's and 1's:

  • Find a subset of these vectors that collectively contain one and only one 1 in each and every column.

For example the follwing set of vectors:

  • A = [ 0, 1, 0]

  • B = [ 1, 1, 0]

  • C = [ 1, 0, 0]

  • D = [ 0, 0, 1]

Has two solutions:

  • A = [ 0, 1, 0]

  • C = [ 1, 0, 0]

  • D = [ 0, 0, 1]

and

  • B = [ 1, 1, 0]

  • D = [ 0, 0, 1]

A better description of the problem can be found here: en.wikipedia.org/wiki/Exact_cover

The “dancing links” algorithm is a commonly used solution for this problem and was found by Donald Knuth. The algorithm involves the construction of a sparse matrix containing nodes that are doubly-linked both horizontally and vertically. The matrix itself simply facilitates the depth-first search (aka backtracking) part of the algorithm.

The importance of the doubly-linked nodes are that they allow for quick removal/restoration of rows/columns of nodes, which is exactly what a backtracking algorithm for the “exact cover” problem needs.

horizontal removal:

  • node.left.right = node.right

  • node.right.left = node.left

horizontal restoration:

  • node.left.right = node

  • node.right.left = node

A better description of the algorithm can be found here: en.wikipedia.org/wiki/Dancing_Links