public void SolveLine(bool onlyOne) { var r = new Random((int)(DateTime.Now.Ticks % int.MaxValue)); var allLinesTop = Top .Where(l => l.Sections.All(s => s.State != SectionState.Wrong)) .Select((l, i) => new { IsLeft = false, Line = i, Rand = r.Next() }); var allLinesLeft = Left .Where(l => l.Sections.All(s => s.State != SectionState.Wrong)) .Select((l, i) => new { IsLeft = true, Line = i, Rand = r.Next() }); var allLinesRandom = allLinesTop .Concat(allLinesLeft) .OrderBy(al => al.Rand); foreach (var line in allLinesRandom) { var side = line.IsLeft ? Left: Top; var sections = side[line.Line].Sections.Select(s => s.Len).ToArray(); var cells = GetMapLine(line.Line, line.IsLeft); var check = new CheckLineClass(cells, sections); var result = check.DoSolveLine(); // if cells if (!cells.Where((t, i) => t == CellState.Unknown && result[i] != CellState.Unknown).Any()) { continue; } for (int i = 0; i < result.Length; i++) { if (GetMapCell(line.Line, i, line.IsLeft) == CellState.Unknown) { SetMapCell(line.Line, i, line.IsLeft, result[i]); } } HistoryNextStep(); if (onlyOne) { return; } } }
private static void CheckLine(Line line, CellState[] cells) { var lines = line.Sections.Select(l => l.Len).ToArray(); var checkLine = new CheckLineClass(cells, lines); var result = checkLine.DoCheckLine(); for (int i = 0; i < result.Length; i++) { line.Sections[i].State = result[i]; } line.IsSolveChecked = true; }
public void SolveLine(bool onlyOne) { var r = new Random((int) (DateTime.Now.Ticks%int.MaxValue)); var allLinesTop = Top .Where(l => l.Sections.All(s => s.State != SectionState.Wrong)) .Select((l, i) => new { IsLeft = false, Line = i, Rand = r.Next() }); var allLinesLeft = Left .Where(l => l.Sections.All(s => s.State != SectionState.Wrong)) .Select((l, i) => new { IsLeft = true, Line = i, Rand = r.Next() }); var allLinesRandom = allLinesTop .Concat(allLinesLeft) .OrderBy(al => al.Rand); foreach (var line in allLinesRandom) { var side = line.IsLeft ? Left: Top; var sections = side[line.Line].Sections.Select(s => s.Len).ToArray(); var cells = GetMapLine(line.Line, line.IsLeft); var check = new CheckLineClass(cells, sections); var result = check.DoSolveLine(); // if cells if (!cells.Where((t, i) => t == CellState.Unknown && result[i] != CellState.Unknown).Any()) continue; for (int i = 0; i < result.Length; i++) { if (GetMapCell(line.Line, i, line.IsLeft) == CellState.Unknown) SetMapCell(line.Line, i, line.IsLeft, result[i]); } HistoryNextStep(); if (onlyOne) return; } }