fn mogu_levo(c: char) -> bool { return c == 'S' || c == 'L' || c == 'F' || c == '-'; } fn mogu_desno(c: char) -> bool { return c == 'S' || c == '7' || c == 'J' || c == '-'; } fn mogu_gore(c: char) -> bool { return c == 'S' || c == '7' || c == 'F' || c == '|'; } fn mogu_dole(c: char) -> bool { return c == 'S' || c == 'L' || c == 'J' || c == '|'; } fn bfs(input: &Vec, was: &mut Vec>, x: i32, y: i32, s: u32) -> u32 { if s > 2 && input[y as usize].chars().nth(x as usize).unwrap() == 'S' { return s; } if was[y as usize][x as usize] { return 0; } was[y as usize][x as usize] = true; for (dx, dy) in [(-1, 0), (1, 0), (0, -1), (0, 1)] { let nx = x + dx; let ny = y + dy; if nx >= 0 && nx < input[y as usize].len() as i32 && ny >= 0 && ny < input.len() as i32 { let t = input[y as usize].chars().nth(x as usize).unwrap(); let n = input[ny as usize].chars().nth(nx as usize).unwrap(); let ind: bool; if dx == 1 { ind = mogu_levo(t) && mogu_desno(n); } else if dx == -1 { ind = mogu_desno(t) && mogu_levo(n); } else if dy == 1 { ind = mogu_gore(t) && mogu_dole(n); } else { ind = mogu_dole(t) && mogu_gore(n); } if !ind { continue; } let ret = bfs(input, was, nx, ny, s + 1); // was[ny as usize][nx as usize] = false; if ret != 0 { return ret; } } } return 0; } fn set_s(input: &mut Vec, xs: i32, ys: i32) { let levi = mogu_levo(input[ys as usize].chars().nth(xs as usize - 1).unwrap()); let gornji = mogu_gore(input[ys as usize - 1].chars().nth(xs as usize).unwrap()); let donji = mogu_dole(input[ys as usize + 1].chars().nth(xs as usize).unwrap()); let desni = mogu_desno(input[ys as usize].chars().nth(xs as usize + 1).unwrap()); if donji && gornji { input[ys as usize] = input[ys as usize].replace("S", "|"); } else if donji && levi { input[ys as usize] = input[ys as usize].replace("S", "7"); } else if donji && desni { input[ys as usize] = input[ys as usize].replace("S", "F"); } else if gornji && levi { input[ys as usize] = input[ys as usize].replace("S", "J"); } else if gornji && desni { input[ys as usize] = input[ys as usize].replace("S", "L"); } else if levi && desni { input[ys as usize] = input[ys as usize].replace("S", "-"); } else { panic!(); } } fn part2(input: &Vec, was: Vec>) -> u32 { let mut s: u32 = 0; let mut en: bool; let mut lc: char; for i in 0..input.len() { en = false; lc = 'S'; for j in 0..input[i].len() { let c = input[i].chars().nth(j).unwrap(); if !was[i][j] { s += en as u32; continue; } if c == '-' { continue; } else if c == '|' { en = !en; continue; } if lc == 'S' { lc = c; if lc == 'J' || lc == '7' { panic!(); } } else { if (lc == 'F' && c == 'J') || (lc == 'L' && c == '7') { en = !en; } lc = 'S'; } } } return s; } pub fn main() { let txt = std::fs::read_to_string("./input/day10.txt").unwrap(); let mut input: Vec<_> = vec![]; for line in txt.lines() { input.push(line.to_string()); } let mut xs = 0; let mut ys = 0; for i in 0..input.len() { for j in 0..input[i].len() { if input[i].chars().nth(j).unwrap() == 'S' { xs = j as i32; ys = i as i32; } } } let mut was = vec![vec![false; input[0].len()]; input.len()]; bfs(&input, &mut was, xs, ys, 0); set_s(&mut input, xs, ys); println!("{}", part2(&input, was)); }