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 Tuple <GridPoint, Int32> ChooseCell(CellsInfo cellsInfo) { foreach (KeyValuePair <GridPoint, NumbersBinary> cellInfo in cellsInfo.Data) { for (Int32 number = Defs.MinNumber; number <= Defs.MaxNumber; ++number) { if (cellInfo.Value == NumbersBinaryHelper.CreateForNumber(number)) { return(new Tuple <GridPoint, Int32>(cellInfo.Key, number)); } } } return(null); }
private CellsInfo FindPredictObject(Grid grid) { CellsInfo rowPredictObject = Enumerable.Range(1, Defs.GridSide) .Select(grid.ScanRow) .Where(cellsInfo => cellsInfo.Data.Count > 0) .Aggregate((left, right) => left.Data.Count <= right.Data.Count ? left : right); CellsInfo columnPredictObject = Enumerable.Range(1, Defs.GridSide) .Select(grid.ScanColumn) .Where(cellsInfo => cellsInfo.Data.Count > 0) .Aggregate(rowPredictObject, (left, right) => left.Data.Count <= right.Data.Count ? left : right); return(Defs.Squares .Select(grid.ScanSquare) .Where(cellsInfo => cellsInfo.Data.Count > 0) .Aggregate(columnPredictObject, (left, right) => left.Data.Count <= right.Data.Count ? left : right)); }
public PredictContext Create(Grid grid) { if (grid == null) { throw new ArgumentNullException(nameof(grid)); } CellsInfo predictObject = FindPredictObject(grid); Tuple <Int32, NumbersBinary> numberData = CreateNumberData(predictObject.Data.First().Value); foreach (GridPoint cell in predictObject.Data.Keys.ToArray()) { predictObject.Data[cell] = predictObject.Data[cell].AppendRow(grid, cell.Row).AppendColumn(grid, cell.Column).AppendSquare(grid, cell); } Queue <GridPoint> cells = new Queue <GridPoint>(predictObject.Data.Where(info => (info.Value & numberData.Item2) != 0).Select(info => info.Key)); return(new PredictContext(cells, numberData.Item1, grid)); }
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(CellsInfo cellsInfo) { return(cellsInfo.Data.All(info => info.Value != 0)); }
private Tuple <GridPoint, Int32> ChooseCell(CellsInfo cellsInfo, NumbersInfo numbersInfo) { return(ChooseCell(cellsInfo) ?? ChooseCell(numbersInfo)); }