private IEnumerable <Solution> Cover(int k, SearchData searchData) { try { if (k == 0) { RaiseStarted(); } if (IsCancelled()) { RaiseCancelled(); yield break; } RaiseSearchStep(searchData.IterationCount, searchData.CurrentSolution.RowIndexes); searchData.IncrementIterationCount(); if (MatrixIsEmpty(searchData.Root)) { if (searchData.CurrentSolution.RowIndexes.Any()) { searchData.IncrementSolutionCount(); var solutionIndex = searchData.SolutionCount - 1; var solution = searchData.CurrentSolution; RaiseSolutionFound(solution, solutionIndex); yield return(solution); } yield break; } var c = ChooseColumnWithLeastRows(searchData.Root); CoverColumn(c); for (var r = c.Down; r != c; r = r.Down) { if (IsCancelled()) { RaiseCancelled(); yield break; } searchData.PushCurrentSolutionRowIndex(r.RowIndex); for (var j = r.Right; j != r; j = j.Right) { CoverColumn(j.ListHeader); } var recursivelyFoundSolutions = Cover(k + 1, searchData); foreach (var solution in recursivelyFoundSolutions) { yield return(solution); } for (var j = r.Left; j != r; j = j.Left) { UncoverColumn(j.ListHeader); } searchData.PopCurrentSolutionRowIndex(); } UncoverColumn(c); } finally { if (k == 0) { RaiseFinished(); } } }