Find the rows which make each column have one True (was: Knuth's Algorithm X)
Haskell, 100 93 92 87 83 80 bytes

Knuth's algorithm:


g&amp;c=filter(g.any(`elem`c))
(u:v)%a=[c:s|c&lt;-id&amp;u$a,s&lt;-(not&amp;c)v%(not&amp;c$a)]
x%_=[x]


Calculates all covers nondeterministically depth-first in the list monad. Use head to calculate only one since Haskell is lazy. Usage:

*Main&gt; [[1],[2],[3],[4],[5],[6],[7]]%[[1, 4, 7], [1, 4], [4, 5, 7], [3, 5, 6], [2, 3, 6, 7], [2, 7]]
[[[1,4],[2,7],[3,5,6]]]


For more speed by using Knuth's suggestion of selecting column with least ones, use this: (115 bytes, flat list for universe). Finds first solution to the large pentomino cover problem in under a minute when compiled.

import Data.List
[]%_=[[]]
w%a=[c:s|c&lt;-a,c\\(head.sortOn length.group.sort$w:a&gt;&gt;=id)/=c,s&lt;-(w\\c)%[b|b&lt;-a,c\\b==c]]


Thanks to @Zgarb for saving 1+3 bytes!

Thanks to @ChristianSievers for his sage advice and saving 5 bytes and some.

Ungolfed (with flat list universe):

knuthX [] _ = [[]]
knuthX (u:niverse) availableRows = --u chosen deterministically
  [ chosen:solution
  | let rows = filter (elem u) availableRows
  , chosen &lt;- rows  --row chosen nondeterministically in list monad
  , solution &lt;- knuthX
                  (filter (not.(`elem`chosen)) niverse)
                  (filter (not.any(`elem`chosen)) availableRows)
  ]