sudoku-solver/src/solver/solver.rs

45 lines
1.4 KiB
Rust

use crate::board::Board;
use crate::strategy::{NakedSingle, Strategy, StrategyFn};
use crate::validator;
fn try_strategies(strategies: &[StrategyFn], sudoku_board: &Board) -> Option<Box<dyn Strategy>> {
for strategy in strategies {
if let Some(strat) = strategy(&sudoku_board) {
return Some(strat);
}
}
None
}
pub fn solve_board(mut sudoku_board: Board) -> Result<Board, Board> {
if let validator::BoardState::Broken(ind) = validator::validate_board(&sudoku_board) {
println!("{}", sudoku_board.to_url());
panic!(
"Error invalid number at row {} col {}",
(ind / 9) + 1,
(ind % 9) + 1
);
}
let strategies: [StrategyFn; 1] = [NakedSingle::find_instance];
while let Some(ns) = try_strategies(&strategies, &sudoku_board) {
sudoku_board = ns.apply(sudoku_board);
if let validator::BoardState::Broken(ind) = validator::validate_board(&sudoku_board) {
println!("{}", sudoku_board.to_url());
panic!(
"Error invalid number at row {} col {}",
(ind / 9) + 1,
(ind % 9) + 1
);
}
}
match validator::validate_board(&sudoku_board) {
validator::BoardState::Finished => Ok(sudoku_board),
validator::BoardState::InProgress => Err(sudoku_board),
_ => unreachable!(),
}
}