public void TrySolve_MegaPuzzle_Solves() { var puzzle = new PuzzleWithPossibleValues(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 rowRule = new RowUniquenessRule(); var columnRule = new ColumnUniquenessRule(); var boxRule = new BoxUniquenessRule(); var diagonalRule = new DiagonalUniquenessRule(); var ruleKeeper = new DynamicRuleKeeper( new IRule[] { rowRule, columnRule, boxRule, diagonalRule }); var heuristic = new StandardHeuristic( rowRule, columnRule, boxRule); var solver = new PuzzleSolver <PuzzleWithPossibleValues>(ruleKeeper, heuristic); Assert.True(solver.TrySolve(puzzle)); _AssertMegaPuzzleSolved(puzzle); }
public void GetStatsForAllSolutions_WithHeuristics_ReturnsExpectedNumSolutions(Puzzle puzzle, SolveStats expectedStats) { var possibleValues = new PossibleValues(puzzle); var ruleKeeper = new StandardRuleKeeper(puzzle, possibleValues); ISudokuRule rule = ruleKeeper.GetRules()[0]; var heuristics = new StandardHeuristic( puzzle, possibleValues, (IMissingRowValuesTracker)rule, (IMissingColumnValuesTracker)rule, (IMissingBoxValuesTracker)rule); var solver = new PuzzleSolver(puzzle, possibleValues, ruleKeeper, heuristics); Assert.Equal(expectedStats.NumSolutionsFound, solver.GetStatsForAllSolutions().NumSolutionsFound); }
public bool SudokuSpiceDynamicSingle(PuzzleSample puzzle) { var p = new PuzzleWithPossibleValues(puzzle.NullableJaggedMatrix); var standardRules = new StandardRules(); var ruleKeeper = new DynamicRuleKeeper( new IRule[] { standardRules }); var heuristic = new StandardHeuristic( standardRules, standardRules, standardRules); var solver = new RuleBased.PuzzleSolver <PuzzleWithPossibleValues>(ruleKeeper, heuristic); var result = solver.Solve(p, randomizeGuesses: true); return(result.NumEmptySquares == 0); }
public void ComputeStatsForAllSolutions_WithHeuristics_ReturnsExpectedNumSolutions( int?[][] matrix, SolveStats expectedStats) { var ruleKeeper = new StandardRuleKeeper(); IRule rule = ruleKeeper.GetRules()[0]; var heuristics = new StandardHeuristic( (IMissingRowValuesTracker)rule, (IMissingColumnValuesTracker)rule, (IMissingBoxValuesTracker)rule); var solver = new PuzzleSolver <PuzzleWithPossibleValues>(ruleKeeper, heuristics); Assert.Equal( expectedStats.NumSolutionsFound, solver.ComputeStatsForAllSolutions(new PuzzleWithPossibleValues(matrix)).NumSolutionsFound); }
public bool SudokuSpiceDynamicMultiple(PuzzleSample puzzle) { var p = new PuzzleWithPossibleValues(puzzle.NullableJaggedMatrix); var rowRule = new RowUniquenessRule(); var columnRule = new ColumnUniquenessRule(); var boxRule = new BoxUniquenessRule(); var ruleKeeper = new DynamicRuleKeeper( new IRule[] { rowRule, columnRule, boxRule }); var heuristic = new StandardHeuristic( rowRule, columnRule, boxRule); var solver = new RuleBased.PuzzleSolver <PuzzleWithPossibleValues>(ruleKeeper, heuristic); var result = solver.Solve(p, randomizeGuesses: true); return(result.NumEmptySquares == 0); }
public void Constructor_WithFullInjection_Works() { var puzzle = new Puzzle(new int?[, ] { { 1, null /* 4 */, null /* 3 */, 2 }, { null /* 2 */, null /* 3 */, 1, null /* 4 */ }, { null /* 4 */, null /* 1 */, null /* 2 */, null /* 3 */ }, { 3, 2, 4, 1 } }); var possibleValues = new PossibleValues(puzzle); var ruleKeeper = new StandardRuleKeeper(puzzle, possibleValues); var heuristic = new StandardHeuristic(puzzle, possibleValues, ruleKeeper, ruleKeeper, ruleKeeper); var tracker = new SquareTracker(puzzle, possibleValues, ruleKeeper, heuristic); Assert.NotNull(tracker); }
public bool SudokuSpiceDynamicSingle(PuzzleSample puzzle) { var p = new Puzzle(puzzle.NullableMatrix); var possibleValues = new PossibleValues(p); var standardRules = new StandardRules(p, possibleValues.AllPossible); var ruleKeeper = new DynamicRuleKeeper( p, possibleValues, new List <ISudokuRule> { standardRules }); var heuristic = new StandardHeuristic( p, possibleValues, standardRules, standardRules, standardRules); var solver = new PuzzleSolver(p, possibleValues, ruleKeeper, heuristic); solver.SolveRandomly(); return(p.NumEmptySquares == 0); }
public void Solve_ValidPuzzle_SolvesPuzzle(Puzzle puzzle) { var possibleValues = new PossibleValues(puzzle); var rowRule = new RowUniquenessRule(puzzle, possibleValues.AllPossible); var columnRule = new ColumnUniquenessRule(puzzle, possibleValues.AllPossible); var boxRule = new BoxUniquenessRule(puzzle, possibleValues.AllPossible, true); var ruleKeeper = new DynamicRuleKeeper( puzzle, possibleValues, new List <ISudokuRule> { rowRule, columnRule, boxRule }); var heuristic = new StandardHeuristic( puzzle, possibleValues, rowRule, columnRule, boxRule); var solver = new PuzzleSolver(puzzle, possibleValues, ruleKeeper, heuristic); solver.Solve(); _AssertPuzzleSolved(puzzle); }
public bool SudokuSpiceDynamicMultiple(PuzzleSample puzzle) { var p = new Puzzle(puzzle.NullableMatrix); var possibleValues = new PossibleValues(p); var rowRule = new RowUniquenessRule(p, possibleValues.AllPossible); var columnRule = new ColumnUniquenessRule(p, possibleValues.AllPossible); var boxRule = new BoxUniquenessRule(p, possibleValues.AllPossible, true); var ruleKeeper = new DynamicRuleKeeper( p, possibleValues, new List <ISudokuRule> { rowRule, columnRule, boxRule }); var heuristic = new StandardHeuristic( p, possibleValues, rowRule, columnRule, boxRule); var solver = new PuzzleSolver(p, possibleValues, ruleKeeper, heuristic); solver.SolveRandomly(); return(p.NumEmptySquares == 0); }
public void Solve_MegaPuzzle_Solves() { var puzzle = new Puzzle(new int?[, ] { { null, null, null, null, 10, 1, null, 8, null, 15, 3, 11, null, 2, 16, null }, { 14, null, 2, null, null, 4, 3, null, null, 13, 8, null, null, 12, null, null }, { null, null, null, 12, null, null, null, 15, null, null, null, 7, null, null, 9, 10 }, { 1, 10, 15, null, 6, null, null, null, null, 14, null, null, null, null, null, 11 }, { null, 11, 14, 6, null, null, null, 9, 13, 8, null, null, null, null, 2, 3 }, { 12, null, null, null, 4, null, 7, 3, 11, 6, null, null, 16, null, 5, null }, { 13, 16, null, 2, null, null, null, 1, null, null, 5, null, 10, 9, null, null }, { null, 4, null, null, 13, null, 2, null, null, null, 16, 3, 11, null, null, null }, { null, null, null, 10, 3, 6, null, null, null, 9, null, 12, null, null, 4, null }, { null, null, 12, 15, null, 9, null, null, 7, null, null, null, 1, null, 3, 14 }, { null, 1, null, 4, null, null, 5, 12, 3, 10, null, 8, null, null, null, 2 }, { 3, 6, null, null, null, null, 15, 10, 4, null, null, null, 12, 5, 7, null }, { 2, null, null, null, null, null, 4, null, null, null, null, 15, null, 16, 11, 9 }, { 4, 14, null, null, 16, null, null, null, 2, null, null, null, 6, null, null, null }, { null, null, 16, null, null, 7, 8, null, null, 4, 10, null, null, 14, null, 5 }, { null, 3, 6, null, 9, 12, 14, null, 8, null, 13, 16, null, null, null, null } }); var possibleValues = new PossibleValues(puzzle); var rowRule = new RowUniquenessRule(puzzle, possibleValues.AllPossible); var columnRule = new ColumnUniquenessRule(puzzle, possibleValues.AllPossible); var boxRule = new BoxUniquenessRule(puzzle, possibleValues.AllPossible, true); var diagonalRule = new DiagonalUniquenessRule(puzzle, possibleValues.AllPossible); var ruleKeeper = new DynamicRuleKeeper( puzzle, possibleValues, new List <ISudokuRule> { rowRule, columnRule, boxRule, diagonalRule }); var heuristic = new StandardHeuristic( puzzle, possibleValues, rowRule, columnRule, boxRule); var solver = new PuzzleSolver(puzzle, possibleValues, ruleKeeper, heuristic); solver.Solve(); _AssertMegaPuzzleSolved(puzzle); }