static string Run(string[] sudokuArray) { int row, column, index, number, maxNumberOfAttemptsToSolveSudoku = 1000, numberOfAttemptsToSolveSudoku = 0; bool atLeastOneSimulation = false, stateHasBeenSaved = false, numbersAddedWithCertaintyAndThenNoCandidates = false; SudokuBoard sudokuBoard = new SudokuBoard(); Candidates candidates = new Candidates(); int currentSudokuToSolve, numberOfSudokusToSolve = sudokuArray.Length; string result = "S"; sudokuBoard.Init(); candidates.Init(); currentSudokuToSolve = 1; while (currentSudokuToSolve <= numberOfSudokusToSolve && result == "S") { numberOfAttemptsToSolveSudoku = 0; atLeastOneSimulation = false; stateHasBeenSaved = false; numbersAddedWithCertaintyAndThenNoCandidates = false; sudokuBoard.SetWorkingSudokuBoard(currentSudokuToSolve - 1, sudokuArray); candidates.SetCandidates(sudokuBoard); while (numberOfAttemptsToSolveSudoku < maxNumberOfAttemptsToSolveSudoku && !sudokuBoard.SudokuSolved && !numbersAddedWithCertaintyAndThenNoCandidates) { if (numberOfAttemptsToSolveSudoku > 0) { sudokuBoard.RestoreState(); candidates.RestoreState(); } while (candidates.HasCandidates) { number = 0; sudokuBoard.ResetList(); while (number == 0 && sudokuBoard.NextCellInList()) { number = candidates.TryFindNumberToSetInCellWithCertainty(sudokuBoard.CurrentRow, sudokuBoard.CurrentColumn); } if (number == 0) { candidates.SimulateOneNumber(sudokuBoard, out row, out column, out index, out number); atLeastOneSimulation = true; if (!stateHasBeenSaved) { sudokuBoard.SaveState(); candidates.SaveState(); stateHasBeenSaved = true; } } else { row = sudokuBoard.CurrentRow; column = sudokuBoard.CurrentColumn; index = sudokuBoard.CurrentListIndex; } sudokuBoard.SetNumber(row, column, index, number); candidates.UpdateCandidates(row, column, number); } if (!sudokuBoard.SudokuSolved) { if (!atLeastOneSimulation) { numbersAddedWithCertaintyAndThenNoCandidates = true; } else { sudokuBoard.CheckIfCanUpdateBestSoFarSudokuBoard(); numberOfAttemptsToSolveSudoku++; } } } result = ProcessResult(sudokuBoard, currentSudokuToSolve - 1, sudokuArray); if ((currentSudokuToSolve % 500) == 0) { Console.Write("\r" + currentSudokuToSolve.ToString()); } currentSudokuToSolve++; } return(result); }