Skip to content

Commit 85fea28

Browse files
2017: Day 24
1 parent cf66f1b commit 85fea28

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

2017/day24/.vscode/settings.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"[rust]": {
3+
"editor.defaultFormatter": "rust-lang.rust-analyzer",
4+
"editor.formatOnSave": true
5+
},
6+
"rust-analyzer.check.command": "clippy"
7+
}

2017/day24/Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2017/day24/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[package]
2+
name = "day24"
3+
version = "0.1.0"
4+
edition = "2021"

2017/day24/src/main.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use std::{
2+
collections::{HashSet, VecDeque},
3+
fs,
4+
};
5+
6+
struct State {
7+
e: usize,
8+
strength: usize,
9+
seen: HashSet<(usize, usize)>,
10+
}
11+
12+
fn main() {
13+
let input = fs::read_to_string("input.txt").expect("Could not read file");
14+
let bridges = input
15+
.lines()
16+
.map(|l| {
17+
let p = l.split_once('/').unwrap();
18+
(p.0.parse::<usize>().unwrap(), p.1.parse::<usize>().unwrap())
19+
})
20+
.collect::<Vec<_>>();
21+
22+
let mut queue = VecDeque::new();
23+
queue.push_back(State {
24+
e: 0,
25+
strength: 0,
26+
seen: HashSet::new(),
27+
});
28+
29+
let mut max = 0;
30+
let mut longest = 0;
31+
let mut longest_max = 0;
32+
33+
while !queue.is_empty() {
34+
let s = queue.pop_back().unwrap();
35+
36+
if s.strength > max {
37+
max = s.strength;
38+
}
39+
40+
if s.seen.len() > longest {
41+
longest = s.seen.len();
42+
longest_max = s.strength;
43+
} else if s.seen.len() == longest && s.strength > longest_max {
44+
longest_max = s.strength;
45+
}
46+
47+
for b in &bridges {
48+
if (b.0 == s.e || b.1 == s.e) && !s.seen.contains(b) {
49+
let mut ns = s.seen.clone();
50+
ns.insert(*b);
51+
let s = State {
52+
e: if s.e == b.1 { b.0 } else { b.1 },
53+
strength: s.strength + b.0 + b.1,
54+
seen: ns,
55+
};
56+
queue.push_back(s);
57+
}
58+
}
59+
}
60+
61+
// part 1
62+
println!("{}", max);
63+
64+
// part 2
65+
println!("{}", longest_max);
66+
}

0 commit comments

Comments
 (0)