/// <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); }
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)); }
/// <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))); }