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