core_rust/core/utils/
min_turns.rs

1use std::collections::{HashSet, VecDeque};
2
3use crate::core::abstraction::errors::AbstractionError;
4use crate::core::game::*;
5use game_logic::Game;
6use state::State;
7
8/// Compute shortest path (in turns) to the goal using BFS.
9#[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    // Seed BFS with the initial state at depth 0
15    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        // Otherwise expand its neighbors
25        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            // Only enqueue unseen states
33            if visited.insert(next_state.clone()) {
34                queue.push_back((next_state, depth + 1));
35            }
36        }
37    }
38
39    // If BFS exhausts without finding a terminal, no solution
40    Err(AbstractionError::BFSExhausted)
41}