#![allow(dead_code)] #![allow(unused_variables)] #![allow(unused_mut)] use num::complex::Complex as c; use num::Complex; use std::cmp::min; use std::collections::HashMap; use std::fs::File; use std::io::Read; type Matrix = Vec>; fn rec( pos: Complex, dir: Complex, conti: u32, mut hl: i32, s: &mut HashMap<(Complex, Complex, u32), i32>, m: &Matrix, ) -> i32 { if !(0 <= pos.re && pos.re < m[0].len() as i32 && 0 <= pos.im && pos.im < m.len() as i32) { return 999999999; } hl += m[pos.im as usize][pos.re as usize]; if conti > 3 { return 999999999; } // println!("{}", pos); if let Some(hl_) = s.get(&(pos, dir, conti)) { if hl_ <= &hl { return 999999999; } } s.insert((pos, dir, conti), hl); if pos == c::new(m[0].len() as i32 - 1, m.len() as i32 - 1) { return hl; } let mut ret = 999999999; let new_pos = pos + dir; let new_dir = dir; ret = min(ret, rec(new_pos, new_dir, conti + 1, hl, s, m)); let new_pos = pos + dir; let new_dir = dir * c::i(); ret = min(ret, rec(new_pos, new_dir, 0, hl, s, m)); let new_pos = pos + dir; let new_dir = dir * (-c::i()); ret = min(ret, rec(new_pos, new_dir, 0, hl, s, m)); return ret; } fn main() { let filename = "in/day17.ref"; // let filename = "in/day17.pzl"; let mut f = File::open(filename).expect("cannot open file"); let mut content = String::new(); f.read_to_string(&mut content).expect("cannot read file"); let lines = content.trim_end().split('\n'); // println!("{:?}", lines); let mut m: Matrix = Vec::new(); for line in lines { let mut mr: Vec = Vec::new(); for c in line.chars() { mr.push(c.to_digit(10).unwrap() as i32); } m.push(mr); } // println!("{:?}", m); let mut state: HashMap<(Complex, Complex, u32), i32> = HashMap::new(); let mut pos = c::new(0, 0); let mut dir = c::new(1, 0); let res1 = rec(pos, dir, 0, 0, &mut state, &m); // println!("{:?}", state); let mut res2 = 0; println!("res1: {}", res1); println!("res2: {}", res2); } // 612 too low