private bool _TrySolve(SquareTracker <TPuzzle> tracker) { var puzzle = tracker.Puzzle; if (puzzle.NumEmptySquares == 0) { return(true); } Coordinate c = tracker.GetBestCoordinateToGuess(); Span <int> possibleValues = stackalloc int[puzzle.Size]; int numPossible = tracker.PopulatePossibleValues(in c, possibleValues); for (int i = 0; i < numPossible; ++i) { int possibleValue = possibleValues[i]; if (tracker.TrySet(in c, possibleValue)) { if (_TrySolve(tracker)) { return(true); } tracker.UnsetLast(); } } return(false); }
private bool _TrySolve() { if (_tracker.Puzzle.NumEmptySquares == 0) { return(true); } Coordinate c = _tracker.GetBestCoordinateToGuess(); foreach (int possibleValue in _tracker.GetPossibleValues(in c)) { if (_tracker.TrySet(in c, possibleValue)) { if (_TrySolve()) { return(true); } _tracker.UnsetLast(); } } return(false); }