mirror of
https://github.com/Baipyrus/AoC-23.git
synced 2024-12-26 03:51:45 +00:00
failed attempt at A* pathfinding, no clue
This commit is contained in:
parent
53158f011b
commit
ea761135bb
@ -9,11 +9,78 @@ pub fn part_one() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn pathfind(grid: &mut Vec<Vec<Block>>) -> i32 {
|
fn pathfind(grid: &mut Vec<Vec<Block>>) -> i32 {
|
||||||
|
let mut closed: Vec<&mut Block> = Vec::new();
|
||||||
|
let (end, mut open);
|
||||||
|
{
|
||||||
|
let result = init_pos(grid);
|
||||||
|
end = result.0;
|
||||||
|
open = result.1;
|
||||||
|
};
|
||||||
|
|
||||||
|
while !open.is_empty() {
|
||||||
|
let mut current = None;
|
||||||
|
let mut index = 0;
|
||||||
|
let mut record = std::i32::MAX;
|
||||||
|
|
||||||
|
// Get best distance + heuristic
|
||||||
|
for (i, next) in open.iter().enumerate() {
|
||||||
|
let score = next.d + next.h;
|
||||||
|
if score < record {
|
||||||
|
record = score;
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove current from open set
|
||||||
|
current = Some(open.remove(index));
|
||||||
|
|
||||||
|
if let Some(current) = current {
|
||||||
|
// Break if current is end
|
||||||
|
if current.compare(end) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan neighbors, limit straight line length
|
||||||
|
// Add neighbors to open set
|
||||||
|
for (j, line) in grid.iter_mut().enumerate() {
|
||||||
|
for (i, next) in line.iter_mut().enumerate() {
|
||||||
|
if !closed.contains(&next) && !open.contains(&next) {
|
||||||
|
next.d = current.d + next.c;
|
||||||
|
next.h = next.distance(end);
|
||||||
|
open.push(next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add current to closed set
|
||||||
|
closed.push(current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end.d
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init_pos(grid: &mut Vec<Vec<Block>>) -> (&mut Block, Vec<&mut Block>) {
|
||||||
|
let mut open = Vec::new();
|
||||||
|
|
||||||
|
let middle = grid.len() / 2;
|
||||||
|
let (top, bottom) = grid.split_at_mut(middle);
|
||||||
|
|
||||||
|
let start = top.first_mut().unwrap().first_mut().unwrap();
|
||||||
|
let end = bottom.last_mut().unwrap().last_mut().unwrap();
|
||||||
|
|
||||||
|
start.h = start.distance(end) as i32;
|
||||||
|
open.push(start);
|
||||||
|
|
||||||
|
(end, open)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Block {
|
struct Block {
|
||||||
x: usize,
|
x: usize,
|
||||||
y: usize,
|
y: usize,
|
||||||
|
c: i32,
|
||||||
|
d: i32,
|
||||||
|
h: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Block {
|
impl Block {
|
||||||
@ -28,6 +95,14 @@ impl Block {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq for Block {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.compare(other)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for Block {}
|
||||||
|
|
||||||
fn setup() -> Vec<Vec<Block>> {
|
fn setup() -> Vec<Vec<Block>> {
|
||||||
let name = "day17";
|
let name = "day17";
|
||||||
println!("Executing module '{name}' entrypoint . . . ");
|
println!("Executing module '{name}' entrypoint . . . ");
|
||||||
|
Loading…
Reference in New Issue
Block a user