please just dont look at the code ...

This commit is contained in:
Tim Nope
2022-12-12 16:17:45 +01:00
parent 9ce2ec5876
commit 94fd1d127c
129 changed files with 328 additions and 0 deletions

View File

@ -1,4 +1,114 @@
fn parse_input(inp :Vec<String>) -> Vec<Vec<char>> {
inp.iter().map(|line| line.chars().collect::<Vec<char>>()).collect::<Vec<Vec<char>>>()
}
fn bfs(map :Vec<Vec<char>>, start :(usize, usize), end :(usize, usize)) -> usize {
let mut path_len = 0;
let mut discovered = vec![vec![false; map[0].len()]; map.len()];
discovered[start.0][start.1] = true;
let mut queue :Vec<Vec<(usize, usize)>> = vec![];
queue.push(vec![start]);
while !queue.is_empty() {
let current_path = queue.remove(0);
path_len += 1;
if current_path.last().unwrap().eq(&end) {
println!("{:?}", current_path);
return current_path.len();
}
// up
if current_path.last().unwrap().0 > 0 {
let up = (current_path.last().unwrap().0 - 1, current_path.last().unwrap().1);
if (map[up.0][up.1] as i32 - map[current_path.last().unwrap().0][current_path.last().unwrap().1] as i32) < 2 {
if !discovered[up.0][up.1] {
discovered[up.0][up.1] = true;
let mut new_path = Vec::from(current_path.clone());
new_path.push(up);
queue.push(new_path);
}
}
}
// down
if current_path.last().unwrap().0 < map.len() - 1 {
let down = (current_path.last().unwrap().0 + 1, current_path.last().unwrap().1);
if (map[down.0][down.1] as i32 - map[current_path.last().unwrap().0][current_path.last().unwrap().1] as i32) < 2 {
if !discovered[down.0][down.1] {
let mut new_path = Vec::from(current_path.clone());
discovered[down.0][down.1] = true;
new_path.push(down);
queue.push(new_path);
}
}
}
// left
if current_path.last().unwrap().1 > 0 {
let left = (current_path.last().unwrap().0, current_path.last().unwrap().1 - 1);
if (map[left.0][left.1] as i32 - map[current_path.last().unwrap().0][current_path.last().unwrap().1] as i32) < 2 {
if !discovered[left.0][left.1] {
discovered[left.0][left.1] = true;
let mut new_path = Vec::from(current_path.clone());
new_path.push(left);
queue.push(new_path);
}
}
}
// right
if current_path.last().unwrap().1 < map[0].len() - 1 {
let right = (current_path.last().unwrap().0, current_path.last().unwrap().1 + 1);
if (map[right.0][right.1] as i32 - map[current_path.last().unwrap().0][current_path.last().unwrap().1] as i32) < 2 {
if !discovered[right.0][right.1] {
discovered[right.0][right.1] = true;
let mut new_path = Vec::from(current_path.clone());
new_path.push(right);
queue.push(new_path);
}
}
}
}
return path_len;
}
pub fn run(inp :Vec<String>) {
let mut map = parse_input(inp);
let mut start = (0, 0);
let mut end = (0, 0);
// search for start & end marker & replace them
for i in 0..map.len() {
for i2 in 0..map[i].len() {
if map[i][i2] == 'S' {
start = (i, i2);
map[i][i2] = 'a';
}
if map[i][i2] == 'E' {
end = (i, i2);
map[i][i2] = 'z';
}
}
}
let path_len = bfs(map, start, end);
println!("{}", path_len - 1);
}

View File

@ -1,5 +1,126 @@
fn parse_input(inp :Vec<String>) -> Vec<Vec<char>> {
inp.iter().map(|line| line.chars().collect::<Vec<char>>()).collect::<Vec<Vec<char>>>()
}
fn bfs(map :&Vec<Vec<char>>, start :(usize, usize), end :(usize, usize)) -> Option<usize> {
let mut path_len = 0;
let mut discovered = vec![vec![false; map[0].len()]; map.len()];
discovered[start.0][start.1] = true;
let mut queue :Vec<Vec<(usize, usize)>> = vec![];
queue.push(vec![start]);
while !queue.is_empty() {
let current_path = queue.remove(0);
if current_path.last().unwrap().eq(&end) {
return Some(current_path.len());
}
// up
if current_path.last().unwrap().0 > 0 {
let up = (current_path.last().unwrap().0 - 1, current_path.last().unwrap().1);
if (map[up.0][up.1] as i32 - map[current_path.last().unwrap().0][current_path.last().unwrap().1] as i32) < 2 {
if !discovered[up.0][up.1] {
discovered[up.0][up.1] = true;
let mut new_path = Vec::from(current_path.clone());
new_path.push(up);
queue.push(new_path);
}
}
}
// down
if current_path.last().unwrap().0 < map.len() - 1 {
let down = (current_path.last().unwrap().0 + 1, current_path.last().unwrap().1);
if (map[down.0][down.1] as i32 - map[current_path.last().unwrap().0][current_path.last().unwrap().1] as i32) < 2 {
if !discovered[down.0][down.1] {
let mut new_path = Vec::from(current_path.clone());
discovered[down.0][down.1] = true;
new_path.push(down);
queue.push(new_path);
}
}
}
// left
if current_path.last().unwrap().1 > 0 {
let left = (current_path.last().unwrap().0, current_path.last().unwrap().1 - 1);
if (map[left.0][left.1] as i32 - map[current_path.last().unwrap().0][current_path.last().unwrap().1] as i32) < 2 {
if !discovered[left.0][left.1] {
discovered[left.0][left.1] = true;
let mut new_path = Vec::from(current_path.clone());
new_path.push(left);
queue.push(new_path);
}
}
}
// right
if current_path.last().unwrap().1 < map[0].len() - 1 {
let right = (current_path.last().unwrap().0, current_path.last().unwrap().1 + 1);
if (map[right.0][right.1] as i32 - map[current_path.last().unwrap().0][current_path.last().unwrap().1] as i32) < 2 {
if !discovered[right.0][right.1] {
discovered[right.0][right.1] = true;
let mut new_path = Vec::from(current_path.clone());
new_path.push(right);
queue.push(new_path);
}
}
}
}
return None;
}
pub fn run(inp :Vec<String>) {
let mut map = parse_input(inp);
let mut end = (0, 0);
for i in 0..map.len() {
for i2 in 0..map[i].len() {
if map[i][i2] == 'S' {
map[i][i2] = 'a';
}
if map[i][i2] == 'E' {
end = (i, i2);
map[i][i2] = 'z';
}
}
}
let mut min_path = usize::MAX;
for i in 0..map.len() {
for i2 in 0..map[i].len() {
if map[i][i2] == 'a' {
let start = (i, i2);
let curr_path_len = bfs(&map, start, end);
if curr_path_len.is_none() {
continue;
}
if curr_path_len.unwrap() < min_path {
//println!("{}, {}", min_path, curr_path_len);
min_path = curr_path_len.unwrap();
}
}
}
}
//let path_len = bfs(map, start, end);
println!("a2: {}", min_path - 1);
}