diff --git a/src/bin/dualmaze/main.rs b/src/bin/dualmaze/main.rs index 7d8d412..1f82539 100644 --- a/src/bin/dualmaze/main.rs +++ b/src/bin/dualmaze/main.rs @@ -1,3 +1,5 @@ +use std::cmp::Ordering; +use std::collections::BinaryHeap; use std::env::args; use std::io::stdout; use std::io::Write; @@ -189,13 +191,26 @@ impl Board { } } +#[derive(PartialEq, Eq)] struct Move { from: Point2d, dir: Vec2d, prio: i32, } -fn add_move(board: &Board, open: &mut Vec, rng: &mut R, from: Point2d, dir: Vec2d) +impl PartialOrd for Move { + fn partial_cmp(&self, other: &Move) -> Option { + self.prio.partial_cmp(&other.prio) + } +} + +impl Ord for Move { + fn cmp(&self, other: &Move) -> Ordering { + self.prio.cmp(&other.prio) + } +} + +fn add_move(board: &Board, open: &mut BinaryHeap, rng: &mut R, from: Point2d, dir: Vec2d) where R: Rng, { @@ -232,7 +247,7 @@ fn main() -> std::io::Result<()> { ); let mut board = Board(Vec::new()); - let mut open = Vec::new(); + let mut open = BinaryHeap::new(); let mut last_drawn_minute = 99; loop { if open.is_empty() { @@ -281,7 +296,6 @@ fn main() -> std::io::Result<()> { let work = arg.max(1); let mut count = 0; while !open.is_empty() && count < work { - open.sort_unstable_by(|Move { prio: pa, .. }, Move { prio: pb, .. }| pa.cmp(pb)); let Move { from: p0, dir: dir0, diff --git a/src/bin/maze/main.rs b/src/bin/maze/main.rs index e33a6ca..b983a21 100644 --- a/src/bin/maze/main.rs +++ b/src/bin/maze/main.rs @@ -1,3 +1,5 @@ +use std::cmp::Ordering; +use std::collections::BinaryHeap; use std::env::args; use std::io::stdout; use std::io::Write; @@ -191,13 +193,26 @@ impl Board { } } +#[derive(PartialEq, Eq)] struct Move { from: Point2d, dir: Vec2d, prio: i32, } -fn add_move(board: &Board, open: &mut Vec, rng: &mut R, from: Point2d, dir: Vec2d) +impl PartialOrd for Move { + fn partial_cmp(&self, other: &Move) -> Option { + self.prio.partial_cmp(&other.prio) + } +} + +impl Ord for Move { + fn cmp(&self, other: &Move) -> Ordering { + self.prio.cmp(&other.prio) + } +} + +fn add_move(board: &Board, open: &mut BinaryHeap, rng: &mut R, from: Point2d, dir: Vec2d) where R: Rng, { @@ -236,7 +251,7 @@ fn main() -> std::io::Result<()> { let maze_mid = p2d((maze_size.x - 1) / 4 * 2 + 1, (maze_size.y - 1) / 4 * 2 + 1); let mut board = Board(Vec::new()); - let mut open = Vec::new(); + let mut open = BinaryHeap::new(); let mut last_drawn_minute = 99; loop { if open.is_empty() { @@ -270,7 +285,6 @@ fn main() -> std::io::Result<()> { let work = arg.max(1); let mut count = 0; while !open.is_empty() && count < work { - open.sort_unstable_by(|Move { prio: pa, .. }, Move { prio: pb, .. }| pa.cmp(pb)); let Move { from: p0, dir: dir0, diff --git a/src/point2d.rs b/src/point2d.rs index c3e82d5..029c285 100644 --- a/src/point2d.rs +++ b/src/point2d.rs @@ -2,7 +2,7 @@ use std::ops::Add; use crate::vec2d::Vec2d; -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct Point2d { pub x: i32, pub y: i32, diff --git a/src/vec2d.rs b/src/vec2d.rs index a57f8d3..86cf88c 100644 --- a/src/vec2d.rs +++ b/src/vec2d.rs @@ -1,6 +1,6 @@ use std::ops::Add; -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct Vec2d { pub x: i32, pub y: i32,