コード例 #1
0
        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);
        }