11using SimpleSudokuSolver . Model ;
22using SimpleSudokuSolver . Strategy ;
3- using System . Collections . Generic ;
43
54namespace SimpleSudokuSolver
65{
@@ -10,7 +9,36 @@ namespace SimpleSudokuSolver
109 public partial class DefaultSolver : ISudokuSolver
1110 {
1211 private SudokuPuzzle _sudokuPuzzleAfterFailedSolveSingleStep ;
13- private BasicElimination _basicElimination = new BasicElimination ( ) ;
12+ private readonly BasicElimination _basicElimination = new BasicElimination ( ) ;
13+ private readonly ISudokuSolverStrategy [ ] _strategies ;
14+
15+ /// <summary>
16+ /// Constructor.
17+ /// </summary>
18+ /// <param name="strategies">
19+ /// Strategies used to try and solve the puzzle.
20+ /// If no strategies are provided, a default set of strategies is used.
21+ /// </param>
22+ public DefaultSolver ( params ISudokuSolverStrategy [ ] strategies )
23+ {
24+ if ( strategies . Length > 0 )
25+ {
26+ _strategies = strategies ;
27+ }
28+ else
29+ {
30+ _strategies = new ISudokuSolverStrategy [ ]
31+ {
32+ // Ordered from the simplest to the most complex
33+ new SingleInCells ( ) ,
34+ new HiddenSingle ( ) ,
35+ new NakedSingle ( ) ,
36+ new LockedCandidates ( ) ,
37+ new NakedPair ( ) ,
38+ new NakedTriple ( )
39+ } ;
40+ }
41+ }
1442
1543 /// <inheritdoc />
1644 public SudokuPuzzle Solve ( int [ , ] sudoku )
@@ -29,6 +57,7 @@ public SudokuPuzzle Solve(int[,] sudoku)
2957 else
3058 {
3159 sudokuPuzzle . ApplySingleStepSolution ( solution ) ;
60+ _sudokuPuzzleAfterFailedSolveSingleStep = sudokuPuzzle ;
3261 }
3362 }
3463
@@ -41,29 +70,17 @@ public SingleStepSolution SolveSingleStep(SudokuPuzzle sudokuPuzzle)
4170 if ( sudokuPuzzle . IsSolved ( ) )
4271 return null ;
4372
44- var solvingTechniques = new ISudokuSolverStrategy [ ]
45- {
46- // Ordered from the simples to the most complex
47- new SingleInCells ( ) ,
48- new HiddenSingle ( ) ,
49- new NakedSingle ( ) ,
50- new LockedCandidates ( ) ,
51- new NakedPair ( ) ,
52- new NakedTriple ( )
53- } ;
54-
55- foreach ( var technique in solvingTechniques )
73+ foreach ( var strategy in _strategies )
5674 {
5775 var elimination = _basicElimination . SolveSingleStep ( sudokuPuzzle ) ;
5876 if ( elimination != null )
5977 return elimination ;
6078
61- var solution = technique . SolveSingleStep ( sudokuPuzzle ) ;
79+ var solution = strategy . SolveSingleStep ( sudokuPuzzle ) ;
6280 if ( solution != null )
6381 return solution ;
6482 }
6583
66- _sudokuPuzzleAfterFailedSolveSingleStep = sudokuPuzzle ;
6784 return null ;
6885 }
6986 }
0 commit comments