core_rust/core/utils/
min_turns.rs1use std::collections::{HashSet, VecDeque};
2
3use crate::core::abstraction::errors::AbstractionError;
4use crate::core::game::*;
5use game_logic::Game;
6use state::State;
7
8#[allow(dead_code)]
10pub fn min_turns_to_finish(game: &Game) -> Result<usize, AbstractionError> {
11 let mut visited: HashSet<State> = HashSet::new();
12 let mut queue: VecDeque<(State, usize)> = VecDeque::new();
13
14 let start = game.get_state();
16 queue.push_back((start.clone(), 0));
17 visited.insert(start);
18
19 while let Some((state, depth)) = queue.pop_front() {
20 if state.unit_position == game.goal() {
21 return Ok(depth);
22 }
23
24 for &action in state.valid_moves().iter() {
26 let (next_state, _) =
27 game.simulate(&state, &action)
28 .map_err(|e| AbstractionError::Computation {
29 error: e.to_string(),
30 })?;
31
32 if visited.insert(next_state.clone()) {
34 queue.push_back((next_state, depth + 1));
35 }
36 }
37 }
38
39 Err(AbstractionError::BFSExhausted)
41}