use crate::core::TechniqueFlags;
use super::board::Board;
#[derive(Debug, Clone)]
pub struct Solution {
pub board: Board,
pub solve_path: SolvePath,
}
#[derive(Debug, Clone, Default)]
pub struct SolvePath {
pub steps: Vec<SolveStep>,
}
impl SolvePath {
pub fn new() -> Self {
SolvePath { steps: Vec::new() }
}
}
#[derive(Debug, Clone)]
pub enum SolveStep {
Placement {
row: usize,
col: usize,
value: u8,
flags: TechniqueFlags,
step_number: u32,
candidates_eliminated: u32,
related_cell_count: u8,
difficulty_point: u8,
},
CandidateElimination {
row: usize,
col: usize,
value: u8,
flags: TechniqueFlags,
step_number: u32,
candidates_eliminated: u32,
related_cell_count: u8,
difficulty_point: u8,
},
}
impl SolveStep {
pub fn code(&self) -> &str {
match self {
Self::CandidateElimination { .. } => "elim",
Self::Placement { .. } => "plac",
}
}
pub fn step_number(&self) -> u32 {
match self {
Self::Placement { step_number, .. }
| Self::CandidateElimination { step_number, .. } => *step_number,
}
}
pub fn candidates_eliminated(&self) -> u32 {
match self {
Self::Placement {
candidates_eliminated,
..
}
| Self::CandidateElimination {
candidates_eliminated,
..
} => *candidates_eliminated,
}
}
pub fn related_cell_count(&self) -> u8 {
match self {
Self::Placement {
related_cell_count, ..
}
| Self::CandidateElimination {
related_cell_count, ..
} => *related_cell_count,
}
}
pub fn difficulty_point(&self) -> u8 {
match self {
Self::Placement {
difficulty_point, ..
}
| Self::CandidateElimination {
difficulty_point, ..
} => *difficulty_point,
}
}
}