Ejemplo n.º 1
0
        public Sudoku Solve(Sudoku p_sudoku)
        {
            int  lastUnsolvedCellsCount = 0;
            bool isFinished             = false;

            while (!isFinished)
            {
                IList <SudokuCell> unsolvedCells = p_sudoku.GetUnsolved();
                if (lastUnsolvedCellsCount == unsolvedCells.Count || unsolvedCells.Count == 0)
                {
                    isFinished = true;
                }
                lastUnsolvedCellsCount = unsolvedCells.Count;

                foreach (SudokuCell sudokuCell in unsolvedCells)
                {
                    int findHiddenSingle = FindHiddenSingle(p_sudoku, sudokuCell);
                    if (findHiddenSingle != 0)
                    {
                        sudokuCell.Value = findHiddenSingle;
                        p_sudoku.Update(sudokuCell);
                    }
                }

                p_sudoku = SudokuOperations.UpdateCandidates(p_sudoku);
            }

            return(p_sudoku);
        }
Ejemplo n.º 2
0
        private int FindHiddenSingle(Sudoku p_sudoku, SudokuCell p_sudokuCell)
        {
            IList <SudokuCell> row    = p_sudoku.GetRow(p_sudokuCell.Row);
            IList <SudokuCell> column = p_sudoku.GetColumn(p_sudokuCell.Column);
            IList <SudokuCell> square = p_sudoku.GetSquare(p_sudokuCell.Row, p_sudokuCell.Column);

            int uniqueCandidateValueRow = SudokuOperations.GetUniqueCandidateValue(row);

            if (uniqueCandidateValueRow != 0)
            {
                return(uniqueCandidateValueRow);
            }

            int uniqueCandidateValueColumn = SudokuOperations.GetUniqueCandidateValue(column);

            if (uniqueCandidateValueColumn != 0)
            {
                return(uniqueCandidateValueColumn);
            }

            int uniqueCandidateValueSquare = SudokuOperations.GetUniqueCandidateValue(square);

            if (uniqueCandidateValueSquare != 0)
            {
                return(uniqueCandidateValueSquare);
            }

            return(0);
        }
Ejemplo n.º 3
0
        public Sudoku Solve(Sudoku p_sudoku, Func <Sudoku, SudokuCell, int> p_additionalSolvingLogic = null)
        {
            Queue <ISolvingStrategy> strategyQueue = new Queue <ISolvingStrategy>(SolvingStrategies);

            bool isSolved = false;

            while (!isSolved)
            {
                _currentStrategy = strategyQueue.Peek();

                Sudoku sudoku = _currentStrategy.Solve(p_sudoku);
                if (sudoku.IsSolved())
                {
                    isSolved = true;
                }

                strategyQueue.Dequeue();
                p_sudoku = SudokuOperations.UpdateCandidates(p_sudoku);
            }

            return(p_sudoku);
        }