Exemplo n.º 1
0
        protected Result Process(SudokuField sudokuField, int row, int column)
        {
            SudokuElement sudokuElement   = sudokuField.GetSudokuElement(row, column);
            HashSet <int> existingNumbers = GetNumbersFromSudokuSection(sudokuField, row, column);

            foreach (int number in existingNumbers)
            {
                _ = sudokuElement.RemoveCandidate(number);
            }
            return(AddNumber(sudokuElement));
        }
Exemplo n.º 2
0
        public new SolverResult Process(SudokuField sudokuField)
        {
            _sudokuFieldCopy = sudokuField;
            Stack <StackElement> stackElements = new Stack <StackElement>();
            StackElement         stackElement;
            Result result = Result.None;
            int    index;

            while (true)
            {
                switch (result)
                {
                case Result.FullFilled:
                    return(new SolverResult(Result.FullFilled, _sudokuFieldCopy));

                case Result.Error:
                    bool loop = true;
                    do
                    {
                        if (stackElements.Count == 0)
                        {
                            return(new SolverResult(Result.Error));
                        }

                        stackElement = stackElements.Pop();
                        index        = stackElement.Index + 1;
                        if (index < stackElement.GetCandidateSize())
                        {
                            _sudokuFieldCopy = stackElement.SudokuField;
                            _sudokuElement   = stackElement.SudokuElement;
                            if (PutOnStack(stackElements, index) == Result.Error)
                            {
                                return(new SolverResult(Result.Error));
                            }
                            loop = false;
                        }
                        else
                        {
                            loop = true;
                        }
                    } while (loop);
                    break;

                default:
                    _sudokuElement = FindFirstEmpty(_sudokuFieldCopy);
                    if (PutOnStack(stackElements, 0) == Result.Error)
                    {
                        return(new SolverResult(Result.Error));
                    }
                    break;
                }
                result = base.Process(_sudokuFieldCopy);
            }
        }
Exemplo n.º 3
0
        private Result AddNumber(SudokuElement sudokuElement)
        {
            var size = sudokuElement.GetCandidatesSize();

            switch (size)
            {
            case 0:
                return(Result.Error);

            case 1:
                sudokuElement.Number    = sudokuElement.GetFirstCandidate();
                sudokuElement.FontColor = Data.SingleColor;
                return(Result.Added);

            default:
                return(Result.None);
            }
        }
Exemplo n.º 4
0
        private Result PutOnStack(Stack <StackElement> stack, int index)
        {
            StackElement stackElement = new StackElement(_sudokuFieldCopy, _sudokuElement, index);

            stack.Push(stackElement);

            _sudokuFieldCopy = _sudokuFieldCopy.DeepCopy();
            _sudokuElement   = FindFirstEmpty(_sudokuFieldCopy);
            if (_sudokuElement == null)
            {
                return(Result.Error);
            }

            int number = _sudokuElement.GetCandidate(index);

            _sudokuElement.Number    = number;
            _sudokuElement.FontColor = Data.BackTrackColor;

            return(Result.None);
        }
Exemplo n.º 5
0
        protected bool AddUniqueFromExisting(ImmutableSortedDictionary <Position, SudokuElement> elements, SudokuElement sudokuElement, HashSet <int> existngNumbers)
        {
            var result = false;
            var number = FindUniqueCandidates(elements)
                         .Where(n => sudokuElement.ContainCandidate(n))
                         .Where(n => !existngNumbers.Contains(n))
                         .DefaultIfEmpty(0)
                         .First();

            if (number != 0)
            {
                sudokuElement.Number    = number;
                sudokuElement.FontColor = Data.UniqueColor;
                result = true;
            }
            return(result);
        }
Exemplo n.º 6
0
 public int GetCandidateSize()
 {
     return(SudokuElement.GetCandidatesSize());
 }
Exemplo n.º 7
0
 public StackElement(SudokuField sudokuField, SudokuElement sudokuElement, int index)
 {
     SudokuField   = sudokuField;
     SudokuElement = sudokuElement;
     Index         = index;
 }