day 9: part 2: rust
This commit is contained in:
parent
612bd4313f
commit
586ea78d86
|
@ -0,0 +1,6 @@
|
|||
[package]
|
||||
name = "part1"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
|
@ -0,0 +1,92 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
fn parse_graph(string: &str) -> Vec<Vec<u64>> {
|
||||
let mut n = 0;
|
||||
let mut node_to_index: HashMap<String, usize> = HashMap::new();
|
||||
for item in string.lines() {
|
||||
let mut parts = item.split(" ");
|
||||
let city_from = parts.next().unwrap();
|
||||
parts.next();
|
||||
let city_to = parts.next().unwrap();
|
||||
if !node_to_index.contains_key(city_from) {
|
||||
node_to_index.insert(city_from.to_string().clone(), n);
|
||||
n += 1;
|
||||
}
|
||||
if !node_to_index.contains_key(city_to) {
|
||||
node_to_index.insert(city_to.to_string().clone(), n);
|
||||
n += 1;
|
||||
}
|
||||
}
|
||||
let mut graph: Vec<Vec<u64>> = vec![vec![0; n]; n];
|
||||
for item in string.lines() {
|
||||
let mut parts = item.split(" ");
|
||||
let city_from = parts.next().unwrap();
|
||||
parts.next();
|
||||
let city_to = parts.next().unwrap();
|
||||
parts.next();
|
||||
let distance = parts.next().unwrap();
|
||||
let distance: u64 = distance.parse().unwrap();
|
||||
let u = *node_to_index.get(city_from).unwrap();
|
||||
let v = *node_to_index.get(city_to).unwrap();
|
||||
graph[u][v] = distance;
|
||||
graph[v][u] = distance;
|
||||
}
|
||||
return graph;
|
||||
}
|
||||
|
||||
fn all_permutations(n: usize) -> Vec<Vec<usize>> {
|
||||
let mut c: Vec<usize> = vec![0; n];
|
||||
let mut permutations: Vec<Vec<usize>> = Vec::new();
|
||||
let mut permutation: Vec<usize> = Vec::new();
|
||||
for i in 0..n {
|
||||
permutation.push(i);
|
||||
}
|
||||
permutations.push(permutation.clone());
|
||||
|
||||
let mut i = 1;
|
||||
while i < n {
|
||||
if c[i] < i {
|
||||
if i % 2 == 0 {
|
||||
let tmp = permutation[0];
|
||||
permutation[0] = permutation[i];
|
||||
permutation[i] = tmp;
|
||||
} else {
|
||||
let tmp = permutation[c[i]];
|
||||
permutation[c[i]] = permutation[i];
|
||||
permutation[i] = tmp;
|
||||
}
|
||||
permutations.push(permutation.clone());
|
||||
c[i] += 1;
|
||||
i = 1;
|
||||
} else {
|
||||
c[i] = 0;
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
permutations
|
||||
}
|
||||
|
||||
fn shortest_distance_brute_force(graph: &Vec<Vec<u64>>) -> u64 {
|
||||
let mut min_distance: u64 = u64::MAX;
|
||||
for permutation in all_permutations(graph.len()) {
|
||||
let mut distance = 0;
|
||||
for i in 0..(graph.len() - 1) {
|
||||
let u = permutation[i];
|
||||
let v = permutation[i+1];
|
||||
let d = graph[u][v];
|
||||
distance += d;
|
||||
}
|
||||
if distance < min_distance {
|
||||
min_distance = distance;
|
||||
}
|
||||
}
|
||||
min_distance
|
||||
}
|
||||
|
||||
fn main() -> std::io::Result<()> {
|
||||
let string = std::io::read_to_string(std::io::stdin()).unwrap();
|
||||
let graph = parse_graph(&string);
|
||||
let min_distance = shortest_distance_brute_force(&graph);
|
||||
println!("{}", min_distance);
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue