コード例 #1
0
        public ISudokuResult Generate(ISudokuLevel level)
        {
            var result = _solver.GenerateSolved();

            _cellsForHiding = new Queue <SudokuCell>(
                Enumerable.Range(0, _solver.BlockCount * _solver.BlockCount)
                .OrderBy(x => Guid.NewGuid())
                .Select(x => BlockHelper.GetCellByIndex(x, _solver.BlockCount)));

            result       = RemovePossibleValue(result.Data, level);
            result.Level = level.Level;
            return(result);
        }
コード例 #2
0
        private ISudokuResult RemovePossibleValue(int[,] data, ISudokuLevel level)
        {
            var notSuitableCells = new List <SudokuCell>();

            while (_cellsForHiding.Count > 0)
            {
                var cell = _cellsForHiding.Dequeue();
                if (notSuitableCells.Contains(cell))
                {
                    continue;
                }
                int value = data[cell.X, cell.Y];

                data[cell.X, cell.Y] = 0;
                var result = _solver.Solve(data);
                if (result.HasUniqueSolution)
                {
                    if (level.IsMatching(result))
                    {
                        var generateResult = new SudokuResult {
                            BackTrackCount = result.BackTrackCount, ComplexitiesScore = result.ComplexitiesScore
                        };
                        generateResult.AddSolution(data);
                        return(generateResult);
                    }
                    if (!level.IsMaxLimitExceeded(result))
                    {
                        result = RemovePossibleValue(data, level);
                        if (result != null)
                        {
                            return(result);
                        }
                    }
                }
                data[cell.X, cell.Y] = value;
                notSuitableCells.Add(cell);
            }
            foreach (var cell in notSuitableCells)
            {
                _cellsForHiding.Enqueue(cell);
            }
            return(null);
        }