diff --git a/src/sudoku_solver.rs b/src/sudoku_solver.rs index adc56ca..8cafbec 100644 --- a/src/sudoku_solver.rs +++ b/src/sudoku_solver.rs @@ -20,18 +20,27 @@ impl SudokuSolver { fn populate_possible_values(&mut self) { for open_field in &self.playfield.open_fields { let row_index = open_field / self.playfield.size; - let row = &mut self.playfield.fields[row_index]; + let row = &self.playfield.fields[row_index]; + + let possible_values_row = possible_values_from_vec(row, self.playfield.size as u32); + let col_index = open_field % self.playfield.size; + let col = self.playfield.get_column(col_index); + let possible_values_col = possible_values_from_vec(&col, self.playfield.size as u32); - let possible_values = possible_values_from_row(row, self.playfield.size as u32); + let possible_values = possible_values_row + .symmetric_difference(&possible_values_col) + .map(|v| *v) + .collect(); + let row = &mut self.playfield.fields[row_index]; let field = &mut row[col_index]; field.possible_values = possible_values; } } } -fn possible_values_from_row(row: &Vec, max_value: u32) -> Vec { +fn possible_values_from_vec(row: &Vec, max_value: u32) -> HashSet { let possible_values: HashSet = (1..max_value + 1).collect(); let populated_values: HashSet = row @@ -94,7 +103,7 @@ mod tests { assert!(field_4_values.iter().all(|i| expected_4.contains(i))); } } - mod possible_values_from_row { + mod possible_values_from_vec { use super::super::*; use super::*; @@ -105,9 +114,9 @@ mod tests { let expected_row_2 = vec![1, 2]; let expected_row_3 = vec![1, 2, 3]; - let possible_values_row_1 = possible_values_from_row(&playfield.fields[0], 3); - let possible_values_row_2 = possible_values_from_row(&playfield.fields[1], 3); - let possible_values_row_3 = possible_values_from_row(&playfield.fields[2], 3); + let possible_values_row_1 = possible_values_from_vec(&playfield.fields[0], 3); + let possible_values_row_2 = possible_values_from_vec(&playfield.fields[1], 3); + let possible_values_row_3 = possible_values_from_vec(&playfield.fields[2], 3); assert_eq!(possible_values_row_1, expected_row_1); assert!(possible_values_row_2