#position #solution #pony #find #tour #knight #prancing

prancing_pony

使用回溯法实现的骑士之旅的简单实现

2 个版本 (1 个稳定版)

1.0.0 2023年4月23日
0.1.0 2023年4月12日

#1 in #tour

MIT 许可协议

12KB
247

Prancing Pony

即使是外观,这个旅馆看起来也是一户熟悉眼睛的宜人家庭。门上方的标牌上画着一匹肥大的白马用它后腿站立。门上漆有字母: 巴里曼·波塔球之跳跃的马

Prancing Pony 是使用回溯策略实现的骑士之旅的简单实现,适用于可变大小的棋盘和可变起始位置。它保证找到解决方案,并且如果给定的参数没有可能的之旅,它将立即知道。

由于这是一个蛮力且直观的 O(n!) 解决方案,所以不应该期望在大多数配置中在给定的参数中找到结果,但是它对于小于40个方格的小棋盘或以(0,0)位置开始的8x8大小传统棋盘应该表现良好。

用法

let tour_input = prancing_pony::TourInput {
    size_x: 8,
    size_y: 8,
    starting_position: (0,0)
};

let result = prancing_pony::find_solution(tour_input);

match result {
    prancing_pony::TourResult::Solution(t) => {
        println!("Solution found in {} nanoseconds after {} backtracks", t.calculation_time, t.times_backtracked);
        for (index, position) in t.position_history.iter().enumerate() {
            println!("{} - ({} {})", index, position.0, position.1);
        }
    },
    prancing_pony::TourResult::NoSolution => {  println!("No Solution"); },
    prancing_pony::TourResult::InvalidParameters => { println!("Invalid Parameters"); }
}

无运行时依赖