/// <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); }
/// <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); }