public void HasUniqueSolution_NotUnique() { var puzzle = new Puzzle(new int?[][] { new int?[] { null, null, 9, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, 3, 5, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, }); var boxesToConstrain = new Box[] { new Box(new Coordinate(0, 0), 3), new Box(new Coordinate(3, 3), 3), new Box(new Coordinate(6, 6), 3), }; var constraint = new MagicSquaresConstraint( _CreateStandardPossibleValues(9), boxesToConstrain, includeDiagonals: false); var solver = new PuzzleSolver <Puzzle>( new IConstraint[] { new RowUniquenessConstraint(), constraint, }); Assert.False(solver.HasUniqueSolution(puzzle)); }
public void TryConstrain_ConstrainsCorrectly() { var puzzle = new Puzzle(new int?[][] { new int?[] { null, null, 9, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, 3, 5, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, }); var boxesToConstrain = new Box[] { new Box(new Coordinate(0, 0), 3), }; var constraint = new MagicSquaresConstraint( _CreateStandardPossibleValues(9), boxesToConstrain, includeDiagonals: false); var graph = ExactCoverGraph.Create(puzzle); Assert.True(constraint.TryConstrain(puzzle, graph)); _AssertPossibleValuesAtSquare(new(0, 0), new int[] { 1, 2, 4, 5 }, graph); _AssertPossibleValuesAtSquare(new(0, 1), new int[] { 4, 5 }, graph); _AssertPossibleValuesAtSquare(new(1, 0), new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, graph); _AssertPossibleValuesAtSquare(new(1, 1), new int[] { 4, 5, 7, 8 }, graph); _AssertPossibleValuesAtSquare(new(1, 2), new int[] { 1 }, graph); _AssertPossibleValuesAtSquare(new(2, 0), new int[] { 7 }, graph); _AssertPossibleValuesAtSquare(new(3, 0), new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, graph); }
public void Solve_WithManySolutions_CanSolve() { var puzzle = new Puzzle(new int?[][] { new int?[] { null, null, 9, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, 3, 5, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, }); var boxesToConstrain = new Box[] { new Box(new Coordinate(0, 0), 3), new Box(new Coordinate(3, 3), 3), new Box(new Coordinate(6, 6), 3), }; var constraint = new MagicSquaresConstraint( _CreateStandardPossibleValues(9), boxesToConstrain, includeDiagonals: false); var solver = new PuzzleSolver <Puzzle>( new IConstraint[] { new RowUniquenessConstraint(), constraint, }); var solution = solver.Solve(puzzle); Assert.Equal(0, solution.NumEmptySquares); MagicSquareTests.AssertMagicSquaresSatisfied( solution, boxesToConstrain, expectedSum: 15, verifyDiagonals: false); }
public void TryConstrain_IncludingDiagonals_ConstrainsCorrectly() { var puzzle = new Puzzle(new int?[][] { new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, 6, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, 3, 8, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, }); var boxesToConstrain = new Box[] { new Box(new Coordinate(3, 3), 3), }; var constraint = new MagicSquaresConstraint( _CreateStandardPossibleValues(9), boxesToConstrain, includeDiagonals: true); var graph = ExactCoverGraph.Create(puzzle); Assert.True(constraint.TryConstrain(puzzle, graph)); // rows: 18, 27, 45 // rows: all // rows: 4 // cols: all // cols: 84 75 // cols: 1 // 124578 | 4578 | x // 123456789 | 4578 | 1 // 4 | x | x // diagonals \: 16 25 34 -> Has to be 25 when combining top left and middle possibles. // diagonals /: 18 27 45 -> Has to be 45 when combining bottom left and middle possibles. // 25 | 4578 | x // 123456789 | 5 | 1 // 4 | x | x // Note this doesn't filter further because failed optional objectives can't drop // possiblities. _AssertPossibleValuesAtSquare(new(3, 3), new int[] { 2, 5 }, graph); _AssertPossibleValuesAtSquare(new(3, 4), new int[] { 4, 5, 7, 8 }, graph); _AssertPossibleValuesAtSquare(new(4, 3), new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, graph); _AssertPossibleValuesAtSquare(new(4, 4), new int[] { 5 }, graph); _AssertPossibleValuesAtSquare(new(4, 5), new int[] { 1 }, graph); _AssertPossibleValuesAtSquare(new(5, 3), new int[] { 4 }, graph); _AssertPossibleValuesAtSquare(new(6, 3), new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, graph); }
public void TryConstrain_NotPossible_Fails() { var puzzle = new Puzzle(new int?[][] { new int?[] { null, null, 6, null, null, null, null, null, null }, new int?[] { 1, null, null, null, null, null, null, null, null }, new int?[] { null, 3, 8, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, }); var boxesToConstrain = new Box[] { new Box(new Coordinate(0, 0), 3), }; var constraint = new MagicSquaresConstraint( _CreateStandardPossibleValues(9), boxesToConstrain, includeDiagonals: false); var graph = ExactCoverGraph.Create(puzzle); Assert.False(constraint.TryConstrain(puzzle, graph)); }