Example #1
0
        private void _UpdateUniqueCoordinates(
            BitVector possiblesToCheck,
            ReadOnlySpan <Coordinate> coordinatesToCheck,
            Dictionary <Coordinate, BitVector> previousPossibles)
        {
            Span <int> possibleValues = stackalloc int[_numPossibleValues];
            int        numPossible    = possiblesToCheck.PopulateSetBits(possibleValues);

            for (int i = 0; i < numPossible; ++i)
            {
                int        possibleToCheck = possibleValues[i];
                Coordinate?uniqueCoord     = null;
                foreach (Coordinate c in coordinatesToCheck)
                {
                    if (_puzzle.GetPossibleValues(in c).IsBitSet(possibleToCheck))
                    {
                        if (uniqueCoord.HasValue)
                        {
                            uniqueCoord = null;
                            break;
                        }
                        uniqueCoord = c;
                    }
                }
                if (!uniqueCoord.HasValue)
                {
                    continue;
                }
                var possibles = new BitVector();
                possibles.SetBit(possibleToCheck);
                previousPossibles[uniqueCoord.Value] = _puzzle.GetPossibleValues(uniqueCoord.Value);
                _puzzle.SetPossibleValues(uniqueCoord.Value, possibles);
            }
        }