コード例 #1
0
 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));
 }
コード例 #2
0
ファイル: Calculator.cs プロジェクト: stdstring/FunTasks
 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);
     }
 }
コード例 #3
0
ファイル: Calculator.cs プロジェクト: stdstring/FunTasks
 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);
 }
コード例 #4
0
        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));
        }
コード例 #5
0
        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));
        }
コード例 #6
0
ファイル: Calculator.cs プロジェクト: stdstring/FunTasks
        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);
        }
コード例 #7
0
 private Boolean Check(CellsInfo cellsInfo)
 {
     return(cellsInfo.Data.All(info => info.Value != 0));
 }
コード例 #8
0
ファイル: Calculator.cs プロジェクト: stdstring/FunTasks
 private Tuple <GridPoint, Int32> ChooseCell(CellsInfo cellsInfo, NumbersInfo numbersInfo)
 {
     return(ChooseCell(cellsInfo) ?? ChooseCell(numbersInfo));
 }