示例#1
0
        /// <summary>Override; see base.</summary>
        public override ConstraintResult Process(SolverState state)
        {
            var min = state.MinPossible(AffectedCells[0]) + 1;

            for (var i = 1; i < AffectedCells.Length; i++)
            {
                state.MarkImpossible(AffectedCells[i], value => value < min);
                min = state.MinPossible(AffectedCells[i]) + 1;
            }
            var max = state.MaxPossible(AffectedCells[AffectedCells.Length - 1]) - 1;

            for (var i = AffectedCells.Length - 2; i >= 0; i--)
            {
                state.MarkImpossible(AffectedCells[i], value => value > max);
                max = state.MaxPossible(AffectedCells[i]) - 1;
            }
            return(null);
        }
        /// <summary>Override; see base.</summary>
        public override ConstraintResult Process(SolverState state)
        {
            var minPossibleTarget = state.MinPossible(SumCell);
            var maxPossibleTarget = state.MaxPossible(SumCell);
            var minPossibleSum    = Region.Sum(state.MinPossible);
            var maxPossibleSum    = Region.Sum(state.MaxPossible);

            // Constrain the sum cell
            if (state[SumCell] == null)
            {
                state.MarkImpossible(SumCell, value => value <minPossibleSum || value> maxPossibleSum);
            }

            // Constrain the operand cells
            for (var ix = 0; ix < Region.Length; ix++)
            {
                var cell     = Region[ix];
                var minOther = minPossibleSum - state.MinPossible(cell);
                var maxOther = maxPossibleSum - state.MaxPossible(cell);
                state.MarkImpossible(cell, value => minOther + value > maxPossibleTarget || maxOther + value < minPossibleTarget);
            }

            return(null);
        }
示例#3
0
        /// <summary>Override; see base.</summary>
        public override ConstraintResult Process(SolverState state)
        {
            var minPossibleSum = AffectedCells.Sum(state.MinPossible);
            var maxPossibleSum = AffectedCells.Sum(state.MaxPossible);

            for (var ix = 0; ix < AffectedCells.Length; ix++)
            {
                var cell = AffectedCells[ix];
                if (state[cell] != null)
                {
                    continue;
                }
                var minOther = minPossibleSum - state.MinPossible(cell);
                var maxOther = maxPossibleSum - state.MaxPossible(cell);
                state.MarkImpossible(cell, value => minOther + value > Sum || maxOther + value < Sum);
            }

            return(null);
        }