コード例 #1
0
        internal ConstraintHeader CopyToMatrix(ExactCoverMatrix matrix)
        {
            Debug.Assert(FirstLink != null, $"Can't copy a header with a null {nameof(FirstLink)}.");
            Debug.Assert(!IsSatisfied, $"Can't copy a header that's already satisfied.");
            var copy = new ConstraintHeader(matrix);

            foreach (Link?link in GetLinks())
            {
                Square?square = matrix.GetSquare(link.PossibleSquare.Square.Coordinate);
                Debug.Assert(square != null,
                             $"Tried to copy a square link for a null square at {link.PossibleSquare.Square.Coordinate}.");
                PossibleValue?possibleSquare = square.GetPossibleValue(link.PossibleSquare.ValueIndex);
                Debug.Assert(possibleSquare != null, "Tried to link header to null possible square value.");
                _ = Link.CreateConnectedLink(possibleSquare, copy);
            }
            return(copy);
        }
コード例 #2
0
        public static ConstraintHeader CreateConnectedHeader(
            ExactCoverMatrix matrix, ReadOnlySpan <PossibleValue> possibleSquares)
        {
            var header = new ConstraintHeader(matrix);

            matrix.Attach(header);
            foreach (PossibleValue?possibleSquare in possibleSquares)
            {
                _ = Link.CreateConnectedLink(possibleSquare, header);
            }
            if (header.Count == 0)
            {
                throw new ArgumentException(
                          $"Must provide at least one {nameof(PossibleValue)} when creating a {nameof(ConstraintHeader)}.");
            }
            return(header);
        }
コード例 #3
0
 internal ConstraintHeader(ExactCoverMatrix matrix)
 {
     Matrix     = matrix;
     NextHeader = PreviousHeader = this;
 }