|
@@ -136,6 +136,9 @@ mod tests {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+pub type SudokuBoard = [u8; MAX_SIZE as usize];
|
|
|
+pub type SudokuPossible = [Possible; MAX_SIZE as usize];
|
|
|
+
|
|
|
#[derive(Debug)]
|
|
|
pub struct Sudoku {
|
|
|
pub board: [u8; MAX_SIZE as usize],
|
|
@@ -351,7 +354,7 @@ impl Sudoku {
|
|
|
true
|
|
|
}
|
|
|
|
|
|
- fn calculate_possible(&mut self, solutions: &mut u16) -> bool {
|
|
|
+ fn calculate_possible(&mut self, total_solutions: &mut u16, solutions: &mut Vec<SudokuBoard>) -> bool {
|
|
|
for idx in 0..MAX_SIZE {
|
|
|
if self.board[idx as usize] == 0 {
|
|
|
// Ok, there's a blank here
|
|
@@ -391,13 +394,18 @@ impl Sudoku {
|
|
|
|
|
|
self.board[idx as usize] = possible;
|
|
|
if self.puzzle_complete() {
|
|
|
- *solutions += 1;
|
|
|
+ if *total_solutions < solutions.capacity() as u16 {
|
|
|
+ solutions.push(self.board);
|
|
|
+ }
|
|
|
+ *total_solutions += 1;
|
|
|
+ /*
|
|
|
println!("**SOLUTION**");
|
|
|
self.display();
|
|
|
println!("***");
|
|
|
+ */
|
|
|
break;
|
|
|
} else {
|
|
|
- if self.calculate_possible(solutions) {
|
|
|
+ if self.calculate_possible(total_solutions, solutions) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
@@ -416,11 +424,19 @@ impl Sudoku {
|
|
|
possible: [Possible(0); MAX_SIZE as usize],
|
|
|
};
|
|
|
|
|
|
- let mut solutions: u16 = 0;
|
|
|
- workset.calculate_possible(&mut solutions);
|
|
|
+ let mut total_solutions: u16 = 0;
|
|
|
+ let mut solutions = Vec::new();
|
|
|
+ solutions.reserve(1);
|
|
|
+ workset.calculate_possible(&mut total_solutions, &mut solutions);
|
|
|
|
|
|
// return number of solutions.
|
|
|
- solutions
|
|
|
+ if solutions.len() > 0 {
|
|
|
+ println!("*** A solution:");
|
|
|
+ workset.board = solutions[0];
|
|
|
+ workset.display();
|
|
|
+ println!("***");
|
|
|
+ }
|
|
|
+ total_solutions
|
|
|
}
|
|
|
|
|
|
pub fn make(&mut self) {
|