Priority queue added on aoc 15
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user