From 65508cfc33dc52fff5ff46618f75d954abff13b1 Mon Sep 17 00:00:00 2001 From: Daniel Hader Date: Wed, 19 Aug 2026 20:45:53 -0500 Subject: very slow solution implementation --- src/lib.rs | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index 23a954e..3a102c3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,16 +1,49 @@ pub mod rectangular; -pub trait CalanderPuzzle { +pub trait CalendarBoardState { type Placement; + fn add_placement(&mut self, placement: &Self::Placement) -> bool; + fn remove_placement(&mut self, placement: &Self::Placement) -> bool; +} - // returns a Vec that associates with each piece index, - // a Vec of possible placements of that piece +pub trait CalendarPuzzle { + type Placement; + type BoardState: CalendarBoardState; fn placements(&self, allow_flips: bool) -> Vec>; + fn empty_board_state(&self) -> Self::BoardState; + - fn solve(&self) { + fn solve(&self, allow_flips: bool) -> Vec> { + let placements = self.placements(allow_flips); + let mut state = self.empty_board_state(); + let mut solutions = Vec::new(); + backtrack(&mut state, &mut Vec::new(), &placements, &mut solutions); + + solutions } } - - +fn backtrack( + board_state: &mut B, + stack: &mut Vec, + placements: &Vec>, + solutions: &mut Vec>, +) +where B: CalendarBoardState { + let piece_index = stack.len(); + println!("{:?}", stack); + + if piece_index >= placements.len() { + solutions.push(stack.clone()); + } else { + for (i, placement) in placements[piece_index].iter().enumerate() { + if board_state.add_placement(placement) { + stack.push(i); + backtrack(board_state, stack, placements, solutions); + stack.pop(); + board_state.remove_placement(placement); + } + } + } +} -- cgit v1.2.3