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 void Set(int x, int y, HexagonCell value) { MinX = Math.Min(MinX, x); MaxX = Math.Max(MaxX, x + 1); MinY = Math.Min(MinY, y); MaxY = Math.Max(MaxY, y + 1); _HintList = null; map[new Vec2i(x, y)] = value; }
public HexHintList GetHintList(bool raw = false) { HexHintList list = new HexHintList(this); foreach (var hex in this) { if (hex.Value.Hint.IsError) { throw new Exception("OCR failed for some cells"); } switch (hex.Value.Hint.Area) { case CellHintArea.NONE: break; case CellHintArea.DIRECT: list.Add(new HexNeighborHint(this, hex.Value)); break; case CellHintArea.CIRCLE: list.Add(new HexAreaHint(this, hex.Value)); break; case CellHintArea.COLUMN_LEFT: case CellHintArea.COLUMN_DOWN: case CellHintArea.COLUMN_RIGHT: list.Add(new HexRowHint(this, hex.Value)); break; default: throw new ArgumentOutOfRangeException(); } } list.Add(new HexCellSumHint(this)); if (!raw) { list.CleanUp(); list.Optimize(); } return(list); }
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)); }
private HexHintList GetHintList() { HexHintList list = new HexHintList(this); foreach (var hex in this) { switch (hex.Value.Hint.Area) { case CellHintArea.NONE: break; case CellHintArea.DIRECT: list.Add(new HexNeighborHint(this, hex.Value)); break; case CellHintArea.CIRCLE: list.Add(new HexAreaHint(this, hex.Value)); break; case CellHintArea.COLUMN_LEFT: case CellHintArea.COLUMN_DOWN: case CellHintArea.COLUMN_RIGHT: list.Add(new HexRowHint(this, hex.Value)); break; default: throw new ArgumentOutOfRangeException(); } } list.Add(new HexCellSumHint(this)); list.CleanUp(); list.Optimize(); return(list); }