/// <inheritdoc/> public bool TryInit(IReadOnlyPuzzleWithMutablePossibleValues puzzle) { foreach (IRule r in _rules) { if (!r.TryInit(puzzle, puzzle.UniquePossibleValues)) { return(false); } } foreach (Coordinate c in puzzle.GetUnsetCoords()) { foreach (IRule r in _rules) { puzzle.IntersectPossibleValues(in c, r.GetPossibleValues(in c)); } if (puzzle.GetPossibleValues(in c).IsEmpty) { return(false); } } if (_coordTracker is null || _coordTracker.Size != puzzle.Size) { _coordTracker = new CoordinateTracker(puzzle.Size); } _puzzle = puzzle; return(true); }
/// <inheritdoc/> public bool TryInitFor(IReadOnlyPuzzleWithMutablePossibleValues puzzle) { _boxSize = Boxes.IntSquareRoot(puzzle.Size); _puzzle = puzzle; _helper = new UniqueInXHelper(puzzle); return(true); }
/// <inheritdoc/> public bool TryInitFor(IReadOnlyPuzzleWithMutablePossibleValues puzzle) { if (!_rowHeuristic.TryInitFor(puzzle) || !_columnHeuristic.TryInitFor(puzzle) || !_boxHeuristic.TryInitFor(puzzle)) { return(false); } _numHeuristicsRan.Clear(); return(true); }
/// <inheritdoc/> public bool TryInit(IReadOnlyPuzzleWithMutablePossibleValues puzzle) { int size = puzzle.Size; _puzzle = puzzle; _boxSize = Boxes.IntSquareRoot(puzzle.Size); _unsetRowValues = new BitVector[size]; _unsetRowValues.AsSpan().Fill(_puzzle.UniquePossibleValues); Span <BitVector> possibleValues = _unsetRowValues.AsSpan(); _unsetColumnValues = possibleValues.ToArray(); _unsetBoxValues = possibleValues.ToArray(); int boxIdx; for (int row = 0; row < size; row++) { for (int col = 0; col < size; col++) { boxIdx = Boxes.CalculateBoxIndex(new Coordinate(row, col), _boxSize); int?val = puzzle[row, col]; if (!val.HasValue) { continue; } if (!_unsetRowValues[row].IsBitSet(val.Value) || !_unsetColumnValues[col].IsBitSet(val.Value) || !_unsetBoxValues[boxIdx].IsBitSet(val.Value)) { return(false); } _unsetRowValues[row].UnsetBit(val.Value); _unsetColumnValues[col].UnsetBit(val.Value); _unsetBoxValues[boxIdx].UnsetBit(val.Value); } } foreach (Coordinate c in puzzle.GetUnsetCoords()) { _puzzle.IntersectPossibleValues(in c, _GetPossibleValues(in c)); if (_puzzle.GetPossibleValues(in c).IsEmpty) { return(false); } } return(true); }
public UniqueInXHelper CopyWithNewReference(IReadOnlyPuzzleWithMutablePossibleValues puzzle) { return(new UniqueInXHelper(this, puzzle)); }
private UniqueInXHelper(UniqueInXHelper existing, IReadOnlyPuzzleWithMutablePossibleValues puzzle) { _previousPossiblesStack = new(existing._previousPossiblesStack); _numPossibleValues = existing._numPossibleValues; _puzzle = puzzle; }
public UniqueInXHelper(IReadOnlyPuzzleWithMutablePossibleValues puzzle) { _previousPossiblesStack = new(); _numPossibleValues = puzzle.UniquePossibleValues.ComputeCount(); _puzzle = puzzle; }
/// <inheritdoc/> public bool TryInitFor(IReadOnlyPuzzleWithMutablePossibleValues puzzle) { _puzzle = puzzle; _helper = new UniqueInXHelper(puzzle); return(true); }