void UpdateCombinationsRemaining() { BigInteger numCombos = 1; for (int row = 0; row < 9; row++) { for (int column = 0; column < 9; column++) { List <int> numbers = BaseGroupSolver.GetNumbers(SudokuBoard.squares[row, column].Notes); if (numbers.Count > 0) { numCombos *= numbers.Count; } } } if (numCombos == 1) { numCombos = 0; } bool weHaveAReasonableNumberOfCombosWeCanSolve = numCombos < 200_000_000; bool shouldEnableSolveButtons = alwaysEnableSolveButtons || weHaveAReasonableNumberOfCombosWeCanSolve; btnBruteForce.IsEnabled = shouldEnableSolveButtons; btnHint.IsEnabled = shouldEnableSolveButtons; Title = $"The number of combinations is {numCombos}!"; }
bool BruteForceAttack(int startingRow = 0, int startingColumn = 0) { if (startingColumn >= 9) { startingColumn = 0; startingRow++; } for (int row = startingRow; row < 9; row++) { for (int column = startingColumn; column < 9; column++) { startingColumn = 0; ISudokuSquare sudokuSquare = SudokuBoard.squares[row, column]; if (!sudokuSquare.IsEmpty) { continue; } // Magic - I have an empty square!!! if (sudokuSquare.Notes == "") { ShowNotesForSquareAt(sudokuSquare); if (sudokuSquare.Notes == "") // That means we have a conflict. { return(BruteForceAttack(row, column + 1)); } } List <int> notes = BaseGroupSolver.GetNumbers(sudokuSquare.Notes); foreach (int number in notes) { sudokuSquare.Value = number.ToString()[0]; sudokuSquare.HasTestValue = true; numCombinationsTried++; if (HasConflicts(row, column)) { sudokuSquare.Value = Char.MinValue; sudokuSquare.HasTestValue = false; } else if (BruteForceAttack(row, column + 1)) { sudokuSquare.Notes = ""; return(true); } else { sudokuSquare.Value = Char.MinValue; sudokuSquare.HasTestValue = false; } } return(false); } } return(AllSquaresAreFilled()); }