mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement A* rather than Dijkstra.
This commit is contained in:
42
2018/loc.svg
42
2018/loc.svg
@@ -32,10 +32,10 @@ z
|
|||||||
<defs>
|
<defs>
|
||||||
<path d="M 0 0
|
<path d="M 0 0
|
||||||
L 0 3.5
|
L 0 3.5
|
||||||
" id="mec9193305a" style="stroke:#000000;stroke-width:0.8;"/>
|
" id="mfbab4e6f80" style="stroke:#000000;stroke-width:0.8;"/>
|
||||||
</defs>
|
</defs>
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="60.305455" xlink:href="#mec9193305a" y="307.584"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="60.305455" xlink:href="#mfbab4e6f80" y="307.584"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_1">
|
<g id="text_1">
|
||||||
@@ -71,7 +71,7 @@ z
|
|||||||
<g id="xtick_2">
|
<g id="xtick_2">
|
||||||
<g id="line2d_2">
|
<g id="line2d_2">
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="127.941818" xlink:href="#mec9193305a" y="307.584"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="127.941818" xlink:href="#mfbab4e6f80" y="307.584"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_2">
|
<g id="text_2">
|
||||||
@@ -110,7 +110,7 @@ z
|
|||||||
<g id="xtick_3">
|
<g id="xtick_3">
|
||||||
<g id="line2d_3">
|
<g id="line2d_3">
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="195.578182" xlink:href="#mec9193305a" y="307.584"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="195.578182" xlink:href="#mfbab4e6f80" y="307.584"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_3">
|
<g id="text_3">
|
||||||
@@ -139,7 +139,7 @@ z
|
|||||||
<g id="xtick_4">
|
<g id="xtick_4">
|
||||||
<g id="line2d_4">
|
<g id="line2d_4">
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="263.214545" xlink:href="#mec9193305a" y="307.584"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="263.214545" xlink:href="#mfbab4e6f80" y="307.584"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_4">
|
<g id="text_4">
|
||||||
@@ -153,7 +153,7 @@ z
|
|||||||
<g id="xtick_5">
|
<g id="xtick_5">
|
||||||
<g id="line2d_5">
|
<g id="line2d_5">
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="330.850909" xlink:href="#mec9193305a" y="307.584"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="330.850909" xlink:href="#mfbab4e6f80" y="307.584"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_5">
|
<g id="text_5">
|
||||||
@@ -193,7 +193,7 @@ z
|
|||||||
<g id="xtick_6">
|
<g id="xtick_6">
|
||||||
<g id="line2d_6">
|
<g id="line2d_6">
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="398.487273" xlink:href="#mec9193305a" y="307.584"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="398.487273" xlink:href="#mfbab4e6f80" y="307.584"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_6">
|
<g id="text_6">
|
||||||
@@ -286,10 +286,10 @@ z
|
|||||||
<defs>
|
<defs>
|
||||||
<path d="M 0 0
|
<path d="M 0 0
|
||||||
L -3.5 0
|
L -3.5 0
|
||||||
" id="mcf4dca2140" style="stroke:#000000;stroke-width:0.8;"/>
|
" id="m57cd4cc848" style="stroke:#000000;stroke-width:0.8;"/>
|
||||||
</defs>
|
</defs>
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mcf4dca2140" y="295.488"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m57cd4cc848" y="295.488"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_8">
|
<g id="text_8">
|
||||||
@@ -302,7 +302,7 @@ L -3.5 0
|
|||||||
<g id="ytick_2">
|
<g id="ytick_2">
|
||||||
<g id="line2d_8">
|
<g id="line2d_8">
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mcf4dca2140" y="247.488"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m57cd4cc848" y="247.488"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_9">
|
<g id="text_9">
|
||||||
@@ -316,7 +316,7 @@ L -3.5 0
|
|||||||
<g id="ytick_3">
|
<g id="ytick_3">
|
||||||
<g id="line2d_9">
|
<g id="line2d_9">
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mcf4dca2140" y="199.488"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m57cd4cc848" y="199.488"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_10">
|
<g id="text_10">
|
||||||
@@ -331,7 +331,7 @@ L -3.5 0
|
|||||||
<g id="ytick_4">
|
<g id="ytick_4">
|
||||||
<g id="line2d_10">
|
<g id="line2d_10">
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mcf4dca2140" y="151.488"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m57cd4cc848" y="151.488"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_11">
|
<g id="text_11">
|
||||||
@@ -346,7 +346,7 @@ L -3.5 0
|
|||||||
<g id="ytick_5">
|
<g id="ytick_5">
|
||||||
<g id="line2d_11">
|
<g id="line2d_11">
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mcf4dca2140" y="103.488"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m57cd4cc848" y="103.488"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_12">
|
<g id="text_12">
|
||||||
@@ -361,7 +361,7 @@ L -3.5 0
|
|||||||
<g id="ytick_6">
|
<g id="ytick_6">
|
||||||
<g id="line2d_12">
|
<g id="line2d_12">
|
||||||
<g>
|
<g>
|
||||||
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mcf4dca2140" y="55.488"/>
|
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m57cd4cc848" y="55.488"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="text_13">
|
<g id="text_13">
|
||||||
@@ -577,7 +577,7 @@ z
|
|||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g id="line2d_13">
|
<g id="line2d_13">
|
||||||
<path clip-path="url(#p16eef5b12e)" d="M 73.832727 282.048
|
<path clip-path="url(#p9e82416f48)" d="M 73.832727 282.048
|
||||||
L 87.36 277.248
|
L 87.36 277.248
|
||||||
L 100.887273 270.528
|
L 100.887273 270.528
|
||||||
L 114.414545 269.568
|
L 114.414545 269.568
|
||||||
@@ -598,14 +598,14 @@ L 303.796364 263.808
|
|||||||
L 317.323636 278.208
|
L 317.323636 278.208
|
||||||
L 330.850909 270.528
|
L 330.850909 270.528
|
||||||
L 344.378182 283.008
|
L 344.378182 283.008
|
||||||
L 357.905455 289.728
|
L 357.905455 261.888
|
||||||
L 371.432727 289.728
|
L 371.432727 289.728
|
||||||
L 384.96 289.728
|
L 384.96 289.728
|
||||||
L 398.487273 289.728
|
L 398.487273 289.728
|
||||||
" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
|
" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
|
||||||
</g>
|
</g>
|
||||||
<g id="line2d_14">
|
<g id="line2d_14">
|
||||||
<path clip-path="url(#p16eef5b12e)" d="M 73.832727 295.488
|
<path clip-path="url(#p9e82416f48)" d="M 73.832727 295.488
|
||||||
L 87.36 293.568
|
L 87.36 293.568
|
||||||
L 100.887273 295.488
|
L 100.887273 295.488
|
||||||
L 114.414545 295.488
|
L 114.414545 295.488
|
||||||
@@ -626,14 +626,14 @@ L 303.796364 294.528
|
|||||||
L 317.323636 294.528
|
L 317.323636 294.528
|
||||||
L 330.850909 295.488
|
L 330.850909 295.488
|
||||||
L 344.378182 295.488
|
L 344.378182 295.488
|
||||||
L 357.905455 295.488
|
L 357.905455 294.528
|
||||||
L 371.432727 295.488
|
L 371.432727 295.488
|
||||||
L 384.96 295.488
|
L 384.96 295.488
|
||||||
L 398.487273 295.488
|
L 398.487273 295.488
|
||||||
" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/>
|
" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/>
|
||||||
</g>
|
</g>
|
||||||
<g id="line2d_15">
|
<g id="line2d_15">
|
||||||
<path clip-path="url(#p16eef5b12e)" d="M 73.832727 232.128
|
<path clip-path="url(#p9e82416f48)" d="M 73.832727 232.128
|
||||||
L 87.36 218.688
|
L 87.36 218.688
|
||||||
L 100.887273 208.128
|
L 100.887273 208.128
|
||||||
L 114.414545 191.808
|
L 114.414545 191.808
|
||||||
@@ -654,7 +654,7 @@ L 303.796364 143.808
|
|||||||
L 317.323636 225.408
|
L 317.323636 225.408
|
||||||
L 330.850909 140.928
|
L 330.850909 140.928
|
||||||
L 344.378182 237.888
|
L 344.378182 237.888
|
||||||
L 357.905455 277.248
|
L 357.905455 158.208
|
||||||
L 371.432727 277.248
|
L 371.432727 277.248
|
||||||
L 384.96 277.248
|
L 384.96 277.248
|
||||||
L 398.487273 277.248
|
L 398.487273 277.248
|
||||||
@@ -870,7 +870,7 @@ L 348.72625 83.926688
|
|||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<defs>
|
<defs>
|
||||||
<clipPath id="p16eef5b12e">
|
<clipPath id="p9e82416f48">
|
||||||
<rect height="266.112" width="357.12" x="57.6" y="41.472"/>
|
<rect height="266.112" width="357.12" x="57.6" y="41.472"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
</defs>
|
</defs>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
@@ -5,6 +5,7 @@ use std::io::BufRead;
|
|||||||
use std::io::BufReader;
|
use std::io::BufReader;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
|
|
||||||
|
use common::manhattan_distance;
|
||||||
use common::Solution;
|
use common::Solution;
|
||||||
|
|
||||||
type Coordinate = (usize, usize);
|
type Coordinate = (usize, usize);
|
||||||
@@ -104,11 +105,11 @@ impl Solution for Day22 {
|
|||||||
|
|
||||||
let mut todo = BinaryHeap::new();
|
let mut todo = BinaryHeap::new();
|
||||||
let mut visited: HashSet<State> = HashSet::new();
|
let mut visited: HashSet<State> = HashSet::new();
|
||||||
todo.push((Reverse(0), State { pos: (0, 0), climbing: false, torch: true }));
|
|
||||||
|
|
||||||
let target_state = State { pos: target, climbing: false, torch: true };
|
let target_state = State { pos: target, climbing: false, torch: true };
|
||||||
|
|
||||||
while let Some((Reverse(dist), state)) = todo.pop() {
|
todo.push((Reverse(manhattan_distance((0, 0), target)), Reverse(0), State { pos: (0, 0), climbing: false, torch: true }));
|
||||||
|
|
||||||
|
while let Some((Reverse(approx), Reverse(dist), state)) = todo.pop() {
|
||||||
if visited.contains(&state) {
|
if visited.contains(&state) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -131,7 +132,7 @@ impl Solution for Day22 {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
todo.push((Reverse(dist + 7), state));
|
todo.push((Reverse(approx + 7), Reverse(dist + 7), state));
|
||||||
}
|
}
|
||||||
|
|
||||||
let xmin = if x == 0 { 0 } else { x - 1 };
|
let xmin = if x == 0 { 0 } else { x - 1 };
|
||||||
@@ -146,11 +147,10 @@ impl Solution for Day22 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if !visited.contains(&new_state) && new_state.is_valid(table[yn][xn]) && (x == xn || y == yn) {
|
if !visited.contains(&new_state) && new_state.is_valid(table[yn][xn]) && (x == xn || y == yn) {
|
||||||
todo.push((Reverse(dist + 1), new_state));
|
todo.push((Reverse(dist + 1 + manhattan_distance(target, new_state.pos)), Reverse(dist + 1), new_state));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//println!("{} {:?} {:?}", dist, &state, &todo);
|
|
||||||
}
|
}
|
||||||
unreachable!();
|
unreachable!();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user