Skip to main content

solve_nqueens/
solve_nqueens.rs

1/// Example: Solve N-Queens using Zelen translator
2///
3/// This example demonstrates translating MiniZinc to Selen Model and solving it.
4
5fn main() -> Result<(), Box<dyn std::error::Error>> {
6    // Simple N-Queens model
7    let source = r#"
8        int: n = 4;
9        array[1..n] of var 1..n: queens;
10        constraint alldifferent(queens);
11        solve satisfy;
12    "#;
13
14    println!("Parsing MiniZinc model...");
15    let ast = zelen::parse(source)?;
16    println!("Parsed {} items", ast.items.len());
17
18    println!("\nTranslating to Selen Model...");
19    let translated = zelen::Translator::translate_with_vars(&ast)?;
20    println!("Translation successful!");
21
22    println!("\nSolving...");
23    match translated.model.solve() {
24        Ok(solution) => {
25            println!("✓ Solution found!");
26            
27            // Extract and display the queens array values
28            if let Some(queens) = translated.int_var_arrays.get("queens") {
29                print!("\nQueens array: [");
30                for (i, var_id) in queens.iter().enumerate() {
31                    if i > 0 { print!(", "); }
32                    match solution[*var_id] {
33                        selen::variables::Val::ValI(val) => print!("{}", val),
34                        _ => print!("?"),
35                    }
36                }
37                println!("]");
38                
39                println!("\nInterpretation: Queen in row i is placed in column queens[i]");
40            }
41            
42            println!("\nSolve stats: {} propagations, {} nodes, {:?}",
43                solution.stats.propagation_count,
44                solution.stats.node_count,
45                solution.stats.solve_time
46            );
47        }
48        Err(e) => {
49            println!("No solution found: {:?}", e);
50        }
51    }
52
53    Ok(())
54}