public Boolean Check(CellsInfo cellsInfo, NumbersInfo numbersInfo) { if (cellsInfo == null) { throw new ArgumentNullException(nameof(cellsInfo)); } if (numbersInfo == null) { throw new ArgumentNullException(nameof(numbersInfo)); } return(Check(cellsInfo) && Check(numbersInfo)); }
private void UseCell(CellsInfo cellsInfo, NumbersInfo numbersInfo, Tuple <GridPoint, Int32> data) { cellsInfo.Data.Remove(data.Item1); foreach (GridPoint cell in cellsInfo.Data.Keys.ToArray()) { cellsInfo.Data[cell] = cellsInfo.Data[cell].UseNumber(data.Item2); } numbersInfo.Data.Remove(data.Item2); foreach (Int32 number in numbersInfo.Data.Keys.ToArray()) { numbersInfo.Data[number].Remove(data.Item1); } }
private Boolean Process(CellsInfo cellsInfo, CalculationContext context) { NumbersInfo numbersInfo = _numbersInfoFactory.Create(cellsInfo); Tuple <GridPoint, Int32> data = ChooseCell(cellsInfo, numbersInfo); while (data != null) { context.Grid[data.Item1] = data.Item2; context.EmptyCount--; UseCell(cellsInfo, numbersInfo, data); if (!_checker.Check(cellsInfo, numbersInfo)) { return(false); } data = ChooseCell(cellsInfo, numbersInfo); } return(true); }
private Boolean Check(NumbersInfo numbersInfo) { return(numbersInfo.Data.All(info => info.Value.Count > 0)); }
private Tuple <GridPoint, Int32> ChooseCell(CellsInfo cellsInfo, NumbersInfo numbersInfo) { return(ChooseCell(cellsInfo) ?? ChooseCell(numbersInfo)); }
private Tuple <GridPoint, Int32> ChooseCell(NumbersInfo numbersInfo) { return(numbersInfo.Data.Where(info => info.Value.Count == 1).Select(info => new Tuple <GridPoint, Int32>(info.Value[0], info.Key)).FirstOrDefault()); }