Skip to content

Commit 1a83ead

Browse files
2017: Optimize day 24
1 parent 85fea28 commit 1a83ead

File tree

1 file changed

+55
-44
lines changed

1 file changed

+55
-44
lines changed

2017/day24/src/main.rs

+55-44
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,76 @@
1-
use std::{
2-
collections::{HashSet, VecDeque},
3-
fs,
4-
};
1+
use std::fs;
52

6-
struct State {
3+
fn dfs(
4+
bridges: &mut Vec<(usize, usize, bool)>,
75
e: usize,
86
strength: usize,
9-
seen: HashSet<(usize, usize)>,
7+
length: usize,
8+
max_strength: &mut usize,
9+
longest: &mut usize,
10+
longest_max: &mut usize,
11+
) {
12+
if strength > *max_strength {
13+
*max_strength = strength;
14+
}
15+
16+
if length > *longest {
17+
*longest = length;
18+
*longest_max = strength;
19+
} else if length == *longest && strength > *longest_max {
20+
*longest_max = strength;
21+
}
22+
23+
for i in 0..bridges.len() {
24+
if !bridges[i].2 && (e == bridges[i].0 || e == bridges[i].1) {
25+
bridges[i].2 = true;
26+
dfs(
27+
bridges,
28+
if e == bridges[i].0 {
29+
bridges[i].1
30+
} else {
31+
bridges[i].0
32+
},
33+
strength + bridges[i].0 + bridges[i].1,
34+
length + 1,
35+
max_strength,
36+
longest,
37+
longest_max,
38+
);
39+
bridges[i].2 = false;
40+
}
41+
}
1042
}
1143

1244
fn main() {
1345
let input = fs::read_to_string("input.txt").expect("Could not read file");
14-
let bridges = input
46+
let mut bridges = input
1547
.lines()
1648
.map(|l| {
1749
let p = l.split_once('/').unwrap();
18-
(p.0.parse::<usize>().unwrap(), p.1.parse::<usize>().unwrap())
50+
(
51+
p.0.parse::<usize>().unwrap(),
52+
p.1.parse::<usize>().unwrap(),
53+
false,
54+
)
1955
})
2056
.collect::<Vec<_>>();
2157

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;
58+
let mut max_strength = 0;
3059
let mut longest = 0;
3160
let mut longest_max = 0;
3261

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-
}
62+
dfs(
63+
&mut bridges,
64+
0,
65+
0,
66+
0,
67+
&mut max_strength,
68+
&mut longest,
69+
&mut longest_max,
70+
);
6071

6172
// part 1
62-
println!("{}", max);
73+
println!("{}", max_strength);
6374

6475
// part 2
6576
println!("{}", longest_max);

0 commit comments

Comments
 (0)