Priority queue added on aoc 15

This commit is contained in:
2023-09-19 16:32:57 +02:00
parent 7a0bc59bd2
commit 4f1a3b8e7a
3 changed files with 90 additions and 3 deletions

View File

@@ -5,6 +5,7 @@ use nom::{
sequence::{preceded, separated_pair},
IResult,
};
use priority_queue::PriorityQueue;
use std::collections::HashSet;
fn parse_input(input: &str) -> IResult<&str, Vec<((i32, i32), (i32, i32))>> {
@@ -63,16 +64,19 @@ fn fill_line(
}
}
#[derive(PartialEq, Eq, Hash)]
enum EventType {
Start,
Intersection,
Middle,
End,
}
#[derive(PartialEq, Eq, Hash)]
struct Event {
x: i32,
y: i32,
coord: (i32, i32),
t: EventType,
line_id: u32,
}
fn main() {
@@ -119,5 +123,54 @@ fn main() {
// Je krijgt dan 3 event-types: start van een lijnstuk, een kruising en het einde van een lijnstuk.
// Enige is dat je alleen in de daadwerkelijke coordinaat-range zoals in de opgave dingen wilt
// mee laten tellen.
const max_coord: i32 = 4000000;
const MAX_COORD: i32 = 8000000;
let mut event_queue: PriorityQueue<Event, (i32, i32)> = PriorityQueue::new();
let mut line_id = 0;
for &(sensor, beacon) in coord_list.iter() {
let sensor = (sensor.0 * 2, sensor.1 * 2);
let beacon = (beacon.0 * 2, beacon.1 * 2);
let dist = manhattan_dist(sensor, beacon);
let begin = (sensor.0 + dist, sensor.1);
let middle_1 = (sensor.0, sensor.1 - dist);
let middle_2 = (sensor.0, sensor.1 + dist);
let end = (sensor.0 - dist, sensor.1);
event_queue.push(
Event {
coord: begin,
t: EventType::Start,
line_id,
},
begin,
);
event_queue.push(
Event {
coord: middle_1,
t: EventType::Middle,
line_id,
},
middle_1,
);
event_queue.push(
Event {
coord: middle_2,
t: EventType::Middle,
line_id,
},
middle_2,
);
event_queue.push(
Event {
coord: end,
t: EventType::End,
line_id,
},
end,
);
line_id += 1;
}
}