Пример #1
0
        //Vyřeší Sudoku
        public void SolveBoard(SudokuBoard board)
        {
            //Sudoku je vyřešeno a víme že řešení není jedno, nejedeme dále
            if (solution != null || multipleSolutions)
            {
                return;
            }

            if (!board.IsValid())
            {
                return;
            }

            //Vyplní všechna pole, která mají jen jednu možnost a najde pole s nejnižším počtem možností
            Point lowest = board.FindLowestPossibilities();

            if (board.IsSolved())
            {
                if (solution != null)
                {
                    multipleSolutions = true;
                }
                else
                {
                    solution = board.data;
                }

                return;
            }

            if (lowest.X == -1 || lowest.Y == -1)
            {
                return;
            }

            foreach (int num in board.FindPossibilities(lowest.X, lowest.Y))
            {
                SudokuBoard cloneBoard = board.Clone();
                cloneBoard.SetValue(lowest.X, lowest.Y, num);

                if (!cloneBoard.IsValid())
                {
                    continue;
                }

                SolveBoard(cloneBoard);
            }
        }