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)); }
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); } }
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); } }
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); }
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); }
public int GetCandidateSize() { return(SudokuElement.GetCandidatesSize()); }
public StackElement(SudokuField sudokuField, SudokuElement sudokuElement, int index) { SudokuField = sudokuField; SudokuElement = sudokuElement; Index = index; }