Beispiel #1
0
        /// <inheritdoc/>
        public TPuzzle Solve(TPuzzle puzzle, bool randomizeGuesses = false)
        {
            if (!_AreValuesUnique(puzzle.AllPossibleValuesSpan))
            {
                throw new ArgumentException(
                          $"{nameof(puzzle.AllPossibleValuesSpan)} must all be unique. Received values: {puzzle.AllPossibleValuesSpan.ToString()}.");
            }
            var puzzleCopy = puzzle.DeepCopy();
            var graph      = ExactCoverGraph.Create(puzzleCopy);

            foreach (IConstraint?constraint in _constraints)
            {
                if (!constraint.TryConstrain(puzzleCopy, graph))
                {
                    throw new ArgumentException("Puzzle violates this solver's constraints.");
                }
                ;
            }
            if (!(randomizeGuesses ?
                  _TrySolveRandomly(new Guesser <TPuzzle>(puzzleCopy, graph), new Random()) :
                  _TrySolve(new Guesser <TPuzzle>(puzzleCopy, graph))))
            {
                throw new ArgumentException("Failed to solve the given puzzle.");
            }
            return(puzzleCopy);
        }
Beispiel #2
0
        private SolveStats _ComputeStats(TPuzzle puzzle, bool validateUniquenessOnly, CancellationToken?token)
        {
            if (!_AreValuesUnique(puzzle.AllPossibleValuesSpan))
            {
                return(new SolveStats());
            }
            var puzzleCopy = puzzle.DeepCopy();
            var graph      = ExactCoverGraph.Create(puzzleCopy);

            foreach (IConstraint?constraint in _constraints)
            {
                if (!constraint.TryConstrain(puzzleCopy, graph))
                {
                    return(new SolveStats());
                }
            }
            return(_TryAllSolutions(new Guesser <TPuzzle>(puzzleCopy, graph), validateUniquenessOnly, token));
        }
Beispiel #3
0
        /// <inheritdoc/>
        public bool TrySolve(TPuzzle puzzle, bool randomizeGuesses = false)
        {
            if (!_AreValuesUnique(puzzle.AllPossibleValuesSpan))
            {
                return(false);
            }
            var graph = ExactCoverGraph.Create(puzzle);

            foreach (IConstraint?constraint in _constraints)
            {
                if (!constraint.TryConstrain(puzzle, graph))
                {
                    return(false);
                }
            }
            return(randomizeGuesses ?
                   _TrySolveRandomly(new Guesser <TPuzzle>(puzzle, graph), new Random()) :
                   _TrySolve(new Guesser <TPuzzle>(puzzle, graph)));
        }