Example #1
0
 /// <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);
 }
Example #3
0
 /// <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);
        }
Example #5
0
 public UniqueInXHelper CopyWithNewReference(IReadOnlyPuzzleWithMutablePossibleValues puzzle)
 {
     return(new UniqueInXHelper(this, puzzle));
 }
Example #6
0
 private UniqueInXHelper(UniqueInXHelper existing, IReadOnlyPuzzleWithMutablePossibleValues puzzle)
 {
     _previousPossiblesStack = new(existing._previousPossiblesStack);
     _numPossibleValues      = existing._numPossibleValues;
     _puzzle = puzzle;
 }
Example #7
0
 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);
 }