public IEnumerable <HexStep> GetSolutions_Double(HexHintList hintlist) { var varcells = GetCells().Where(p => p.Type == HexagonType.HIDDEN).ToList(); if (varcells.Count > LIMIT_DOUBLE) { yield break; } List <HexHint> hints = varcells.SelectMany(p => hintlist.Get(p.Position)).Distinct().ToList(); foreach (var add_cells in hints.OrderBy(p => p.GetCells().Count(q => q.Type == HexagonType.HIDDEN)).Where(p => p.GetCells().Where(q => q.Type == HexagonType.HIDDEN).Any(q => !varcells.Contains(q)))) { var new_varcells = varcells.Concat(add_cells.GetCells().Where(p => p.Type == HexagonType.HIDDEN)).Distinct().ToList(); if (new_varcells.Count > LIMIT_DOUBLE) { break; } var new_hints = varcells.SelectMany(p => hintlist.Get(p.Position)).Distinct().ToList(); foreach (var solution in GetSolutions(new_varcells, -1, new_hints)) { yield return(solution); } } }
public List <HexStep> GetSolutions_Single(HexHintList hintlist) { var varcells = GetCells().Where(p => p.Type == HexagonType.HIDDEN).ToList(); if (varcells.Count > LIMIT_SINGLE) { return(Enumerable.Empty <HexStep>().ToList()); } List <HexHint> hints = varcells.SelectMany(p => hintlist.Get(p.Position)).Distinct().ToList(); int myNumber = GetNumber() - GetCells().Count(p => p.Type == HexagonType.ACTIVE); if (myNumber < 0) { throw new Exception("Invalid Game state [Number < 0]"); } return(GetSolutions(varcells, myNumber, hints)); }