public void Solve_WithOneSolutionUsingDiagonals_Works() { var puzzle = new PuzzleWithPossibleValues(new int?[][] { new int?[] { null, null, null, null, null, null, null, 1, 2 }, new int?[] { null, 5, null, null, 9, null, null, null, null }, new int?[] { null, null, null, null, null, 8, null, null, null }, new int?[] { null, 3, null, null, null, null, 5, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, 9, null }, new int?[] { null, null, null, null, 4, 3, 9, null, null }, new int?[] { 6, null, 1, null, null, null, 7, null, null }, new int?[] { 2, null, null, null, null, null, null, null, null }, }); var magicSquares = new Box[] { new Box(new Coordinate(3, 3), 3), }; var solver = new PuzzleSolver <PuzzleWithPossibleValues>( new DynamicRuleKeeper( new IRule[] { new RowUniquenessRule(), new ColumnUniquenessRule(), new BoxUniquenessRule(), new MagicSquaresRule(puzzle.Size, magicSquares, includeDiagonals: true), })); var solution = solver.Solve(puzzle); PuzzleTestUtils.AssertStandardPuzzleSolved(solution); MagicSquareTests.AssertMagicSquaresSatisfied( solution, magicSquares, expectedSum: 15, verifyDiagonals: false); }
public void Solve_WithMegaPuzzle_Solves() { var puzzle = new Puzzle(new int?[][] { new int?[] { null, null, null, null, 10, 1, null, 8, null, 15, 3, 11, null, 2, 16, null }, new int?[] { 14, null, 2, null, null, 4, 3, null, null, 13, 8, null, null, 12, null, null }, new int?[] { null, null, null, 12, null, null, null, 15, null, null, null, 7, null, null, 9, 10 }, new int?[] { 1, 10, 15, null, 6, null, null, null, null, 14, null, null, null, null, null, 11 }, new int?[] { null, 11, 14, 6, null, null, null, 9, 13, 8, null, null, null, null, 2, 3 }, new int?[] { 12, null, null, null, 4, null, 7, 3, 11, 6, null, null, 16, null, 5, null }, new int?[] { 13, 16, null, 2, null, null, null, 1, null, null, 5, null, 10, 9, null, null }, new int?[] { null, 4, null, null, 13, null, 2, null, null, null, 16, 3, 11, null, null, null }, new int?[] { null, null, null, 10, 3, 6, null, null, null, 9, null, 12, null, null, 4, null }, new int?[] { null, null, 12, 15, null, 9, null, null, 7, null, null, null, 1, null, 3, 14 }, new int?[] { null, 1, null, 4, null, null, 5, 12, 3, 10, null, 8, null, null, null, 2 }, new int?[] { 3, 6, null, null, null, null, 15, 10, 4, null, null, null, 12, 5, 7, null }, new int?[] { 2, null, null, null, null, null, 4, null, null, null, null, 15, null, 16, 11, 9 }, new int?[] { 4, 14, null, null, 16, null, null, null, 2, null, null, null, 6, null, null, null }, new int?[] { null, null, 16, null, null, 7, 8, null, null, 4, 10, null, null, 14, null, 5 }, new int?[] { null, 3, 6, null, 9, 12, 14, null, 8, null, 13, 16, null, null, null, null } }); var solver = new PuzzleSolver <Puzzle>( new IConstraint[] { new RowUniquenessConstraint(), new ColumnUniquenessConstraint(), new BoxUniquenessConstraint(), new DiagonalUniquenessConstraint() }); var solved = solver.Solve(puzzle); PuzzleTestUtils.AssertStandardPuzzleSolved(solved); }
public void SolvesCorrectly_WithDiagonals() { var puzzle = new Puzzle(new int?[][] { new int?[] { null, null, null, null, null, null, null, 1, 2 }, new int?[] { null, 5, null, null, 9, null, null, null, null }, new int?[] { null, null, null, null, null, 8, null, null, null }, new int?[] { null, 3, null, null, null, null, 5, null, null }, new int?[] { null, null, null, null, null, null, null, null, null }, new int?[] { null, null, null, null, null, null, null, 9, null }, new int?[] { null, null, null, null, 4, 3, 9, null, null }, new int?[] { 6, null, 1, null, null, null, 7, null, null }, new int?[] { 2, null, null, null, null, null, null, null, null }, }); var boxesToConstrain = new Box[] { new Box(new Coordinate(3, 3), 3), }; var solver = new PuzzleSolver <Puzzle>( new IConstraint[] { new RowUniquenessConstraint(), new ColumnUniquenessConstraint(), new BoxUniquenessConstraint(), new MagicSquaresConstraint( _CreateStandardPossibleValues(9), boxesToConstrain, includeDiagonals: true) }); var solution = solver.Solve(puzzle); PuzzleTestUtils.AssertStandardPuzzleSolved(solution); MagicSquareTests.AssertMagicSquaresSatisfied(solution, boxesToConstrain, 15, verifyDiagonals: true); }
public void CreateSolver_CanSolveStandardPuzzles(int?[][] matrix) { var solver = StandardPuzzles.CreateSolver(); var solved = solver.Solve(new Puzzle(matrix)); PuzzleTestUtils.AssertStandardPuzzleSolved(solved); }
public void TrySolve_ValidPuzzle_SolvesPuzzleInPlace(int?[][] matrix) { var puzzle = new PuzzleWithPossibleValues(matrix); var solver = StandardPuzzles.CreateSolver(); Assert.True(solver.TrySolve(puzzle)); PuzzleTestUtils.AssertStandardPuzzleSolved(puzzle); }
public void Solve_ValidPuzzle_SolvesPuzzleCopy(int?[][] matrix) { var puzzle = new PuzzleWithPossibleValues(matrix); var solver = StandardPuzzles.CreateSolver(); var solved = solver.Solve(puzzle); PuzzleTestUtils.AssertStandardPuzzleSolved(solved); }
public void SolveRandomly_ValidPuzzle_SolvesPuzzleInPlace(int?[][] matrix) { var puzzle = new PuzzleWithPossibleValues(matrix); var solver = StandardPuzzles.CreateSolver(); var solved = solver.Solve(puzzle, randomizeGuesses: true); PuzzleTestUtils.AssertStandardPuzzleSolved(solved); }
public void TrySolve_ValidPuzzle_SolvesPuzzle(int?[][] matrix) { var puzzle = new Puzzle(matrix); var solver = new PuzzleSolver <Puzzle>( new IConstraint[] { new RowUniquenessConstraint(), new ColumnUniquenessConstraint(), new BoxUniquenessConstraint() }); Assert.True(solver.TrySolve(puzzle)); PuzzleTestUtils.AssertStandardPuzzleSolved(puzzle); }
public void Solve_ValidPuzzle_SolvesPuzzle(int?[][] matrix) { var puzzle = Puzzle.CopyFrom(matrix); var solver = new PuzzleSolver <Puzzle>( new IConstraint[] { new RowUniquenessConstraint(), new ColumnUniquenessConstraint(), new BoxUniquenessConstraint() }); var solved = solver.Solve(puzzle); PuzzleTestUtils.AssertStandardPuzzleSolved(solved); }
private static void _AssertMegaPuzzleSolved(PuzzleWithPossibleValues puzzle) { PuzzleTestUtils.AssertStandardPuzzleSolved(puzzle); var alreadyFound = new HashSet <int>(puzzle.Size); for (int row = 0, col = 0; row < puzzle.Size; row++, col++) { Assert.True(alreadyFound.Add(puzzle[row, col].Value), $"Value at ({row}, {col}) clashed with another value in the backward diagonal!"); } alreadyFound.Clear(); for (int row = 0, col = puzzle.Size - 1; row < puzzle.Size; row++, col--) { Assert.True(alreadyFound.Add(puzzle[row, col].Value), $"Value at ({row}, {col}) clashed with another value in the forward diagonal!"); } }