Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        public void CreateSolver_CanSolveStandardPuzzles(int?[][] matrix)
        {
            var solver = StandardPuzzles.CreateSolver();

            var solved = solver.Solve(new Puzzle(matrix));

            PuzzleTestUtils.AssertStandardPuzzleSolved(solved);
        }
Exemplo n.º 5
0
        public void TrySolve_ValidPuzzle_SolvesPuzzleInPlace(int?[][] matrix)
        {
            var puzzle = new PuzzleWithPossibleValues(matrix);
            var solver = StandardPuzzles.CreateSolver();

            Assert.True(solver.TrySolve(puzzle));
            PuzzleTestUtils.AssertStandardPuzzleSolved(puzzle);
        }
Exemplo n.º 6
0
        public void Solve_ValidPuzzle_SolvesPuzzleCopy(int?[][] matrix)
        {
            var puzzle = new PuzzleWithPossibleValues(matrix);
            var solver = StandardPuzzles.CreateSolver();
            var solved = solver.Solve(puzzle);

            PuzzleTestUtils.AssertStandardPuzzleSolved(solved);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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!");
            }
        }