aboutsummaryrefslogtreecommitdiff
path: root/src/day10pt1.rs
blob: 52db522ecc5d870a7528cbcd66b73119899686e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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<&str>, was: &mut Vec<Vec<bool>>, 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);
            if ret != 0 {
                return ret;
            }
        }
    }
    return 0;
}

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);
    }

    let mut x = 0;
    let mut y = 0;

    for i in 0..input.len() {
        for j in 0..input[i].len() {
            if input[i].chars().nth(j).unwrap() == 'S' {
                x = j as i32;
                y = i as i32;
            }
        }
    }

    let mut was = vec![vec![false; input[0].len()]; input.len()];

    println!("{}", (bfs(&input, &mut was, x, y, 0) + 1) / 2);
}