Compare commits
	
		
			2 Commits
		
	
	
		
			f2eb9929d7
			...
			729308742a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 729308742a | |||
| 6a0ed15470 | 
							
								
								
									
										7
									
								
								day12/Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								day12/Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| # This file is automatically @generated by Cargo. | ||||
| # It is not intended for manual editing. | ||||
| version = 3 | ||||
|  | ||||
| [[package]] | ||||
| name = "day12" | ||||
| version = "0.1.0" | ||||
							
								
								
									
										8
									
								
								day12/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								day12/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| [package] | ||||
| name = "day12" | ||||
| version = "0.1.0" | ||||
| edition = "2021" | ||||
|  | ||||
| # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||
|  | ||||
| [dependencies] | ||||
							
								
								
									
										41
									
								
								day12/input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								day12/input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| abcccccccccccaaaaacccccccaaaaaaccccccccccccccccccccccccccccccccaaaaaaaaaaaaaacccccccccccccccccccaaaaaacccccccacccccccccaaccaaccccccccccccccccccccccccccccccaaaaaa | ||||
| abcccccccccccaaaaaaacccccaaaaaaccccccccaaccccccccccaaaaccccccccaaaaaaaaaaaaaccccccccccccccccccccaaaaaaccccaaaacccccccccaaaaaaccccccccccccccccccccccccccccccccaaaa | ||||
| abccccccccccaaaaaaaacccccaaaaaccccccccaaaacccccccccaaaacccccccccccaaaaaaacccccccccccccccccccccccaaaaacccccaaaaaaccccccccaaaaacccccccccccaaaccccccccccccccccccaaaa | ||||
| abccccccccccaaaaaaaaccccccaaaaacccccccaaaacccccccccaaaacccccaaaccccaaaaaaccccccccccccccccccccccccaaaaacccccaaaaacccccccaaaaaacccccccccccaaaacccccccccccccccccaaaa | ||||
| abccccccccccaaaaaaccccccccaaaaacccccccaaaaccccccccccaaacccccaaaaccaaaaaaaacccccccccccccccccccccccaaaaaccccaaaaacccccccaaaaaaaaccccccccccaaaaccaaccccccccccccaaaaa | ||||
| abcccccccccccccaaaccccccccccccccccccccccccccccccccccccccccccaaaaccaaaaaaaaccccccccccccccccccccccccccccccccaccaaccccaaaaaaaaaaacccccccccccaaaaaaccccccccccccccaccc | ||||
| abcacccccccccccccaaaccccccccccccccaaacccccccccccccccccccccccaaaccaaaacccaaacccccccccccccccccccccccaacccccccccccccccaaacccaaccccccccccccccaaaalllllccccccccccccccc | ||||
| abaacccccccccccccaaaaaacccccccccccaaaccccccccccccccccccccccccccccaaaccccaaaccccccccccccccccccccccaaccccccccccccccccaaaaaaaaccccccccccccccckklllllllccccaaaccccccc | ||||
| abaaaaacccccccccaaaaaaacccccccccaaaaaaaacccccaacccccccccccccccccccccccccaaaccccccccaacccccccccaaaaacaacaacaacccccaaaaaaaaccccccccccccaaakkkkllllllllcccaaaccccccc | ||||
| abaaaaaccccccccaaaaaaaacccccccccaaaaaaaacccccaaaaaacccccccccccccccccccccaaaccccccaaaacacccccccaaaaaaaacaaaaaccccaaaaaaaaaccccccccckkkkkkkkkklsssslllcccaaaaaacccc | ||||
| abaaaccccccccccaaaaaaacccccccccccaaaaacccccccaaaaaaccccccccccccccccccaaaaaaaaccccaaaaaacccccccccaaaaacaaaaacccccaaaaaaaacccaaaccjjkkkkkkkkkssssssslllcccaaaaacccc | ||||
| abaaaccccccccccccaaaaaacccccaacccaaaaaaccccaaaaaaaccaaaccccccccccccccaaaaaaaacccccaaaacccccccccaaaaaccaaaaaacccccccaaaaaaccaaaajjjjkkkkkkssssssssslllcddaaaaccccc | ||||
| abcaaacccccccccccaaaaaacaaacaacccaaaaaaccccaaaaaaaaaaaaaaccccccccccccccaaaaaccccccaaaaccccaaaaaaacaaacccaaaaaaacccaaaaaaaccaaajjjjrrrrrrssssuuuussqmmddddaaaccccc | ||||
| abccaacccccccccccaaccccccaaaaacccaaaccaccccaaaaaaaaaaaaaacccccccccccccaaaaaacccccaacaaccccaaaaacccaaccccacccaaaaaaaaaccaaccaaajjjrrrrrrrrssuuuuuvqqmmmdddaaaccccc | ||||
| abccccccccaaccccccccccccccaaaaaacccccccccccccaaaaaaaaaaaccccccccccccccaaaaaacccccccccccccaaaaaaccccccccccccaaaaaaaaaacccccccccjjjrrruuuuuuuuuuuvvqqmmmmddddaccccc | ||||
| abaacccccaaaaccccccccccccaaaaaaacccccccccccccaacccccaaaaacccccccccccccaccaaacccccccccccccaaaaaacccccccccccaaaaaaaaccccccccccccjjjrrruuuuuuuuxyyvvqqqmmmddddcccccc | ||||
| abaacccccaaaacccccccccccaaaaaaccccccccaaccccccccacccaaaaacccccccccccccccccccccccccccccccccaaaaacccccccccccaaaaaaacccccccccccccjjjrrttuxxxxuxxyyvvqqqqmmmmddddcccc | ||||
| abaacccccaaaacccccccccccaacaaacccccaaaaacccaaaaaaaccccccccccccccccccccccccccccccccccccccccaaacccccccccccccccaaaaaaccccccccccccjjjrrtttxxxxxxyyyvvqqqqqmmmmdddcccc | ||||
| abacccccccccccccccccccccccccaaccccccaaaaaccaaaaaaaccccccccaaccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaccccccccccccjjjqrrttxxxxxxyyyvvvvqqqqmmmdddcccc | ||||
| abccccccccccccccccccccccccccccccccccaaaaaccaaaaaaacccccccaaaccccccccccaaaccccccccccccccccccaaaccccccccccccccaaccccccccccaaccccjjjqqqtttxxxxxyyyyyvvvqqqqmmmeeeccc | ||||
| SbaaccccccaccaaacccccccccccccccccccaaaaacccaaaaaaaaccccaaaaaaaacccccccaaacaaccccccccccccccaaaaaaccccccccccccccccccccccaaaaaaccciiiqqqttxxxxEzyyyyyvvvqqqnnneeeccc | ||||
| abaaccccccaaaaaaccccccccccccccccccccccaaccaaaaaaaaaacccaaaaaaaacccccaaaaaaaaccccccccccccccaaaaaaccccccccccccccccccccccaaaaaaccciiiqqtttxxxyyyyyyyvvvvqqqnnneeeccc | ||||
| abaaaaacccaaaaaaccccccccccccccccccccccccccaaaaaaaaaaccccaaaaaaccccccaaaaaaaaccccccccccccccaaaaaacccccccccccccccccccccccaaaaacciiiqqqttxxyyyyyyywvvvvrrrqnnneeeccc | ||||
| abaaaaacccaaaaaaaccccccccaaaccccccccccccccaacaaaccccccccaaaaaaccccccaaaaaaaccccccccccccccccaaaaaccccccccccccccccccccccaaaaaccciiiqqtttxxxyyyyywwwvrrrrrnnneeecccc | ||||
| abaaaccccaaaaaaaaccccccccaaaacccccccccccccccccaaccccccccaaaaaaccccccccaaaaaccccccccccccccccaacaaccccccccccccccccccccccaaaaaccciiqqqttxxxwwwwyyywwrrrrnnnnneeecccc | ||||
| abaaaccccaaaaaaaaccccccccaaaacccccaaaaacccccccaaccccccccaaccaacccccccaaacaaacccccccccccccccccccccccccccccccccccccccccccccccccciiqqqtttwwwwwwywwwrrrrnnnnneeeccccc | ||||
| abcaaaccccccaaaccccccccccaaaccccccaaaaacccccccccccccaaaaccccccccccccccaacccccccccccccccccccccccccccccccaaaacccccccccccccccccciiiqqqtttssssswwwwwrrrnnnneeeecccccc | ||||
| abccaaccccccaaaccccccccccccccccccaaaaaacccccccccccccaaaaccccccccccccccccccccccccccccccccccccccccccccccaaaaacccccccccccccccccciiiqqqqtssssssswwwwrronnnfeeeacccccc | ||||
| abcccccccccccccccccccccccccccccccaaaaaacccccccccccccaaaaccccccccccccccccccccccccccccccccccccccccccccccaaaaaaccccccccccccccccciiiiqqppssssssswwwwrroonfffeaacccccc | ||||
| abcccccccccccccccccccccccccccccccaaaaaacaaaccccccccccaacccccccccccccccccccccccccccccccccaaacccccccccccaaaaaaccccccccccccccccccihhpppppppppsssssrrroonfffaaaaacccc | ||||
| abcccccccccccccccccccccccccccccccccaacccaaaaacccccccccccccccccccccccccccccccccccccccccccaaaaaaccccccccaaaaaccccccccccccccccccchhhhppppppppppssssrooofffaaaaaacccc | ||||
| abccccccccaaaccccccccccccccccccccccccccaaaaacccccccccccccccccccccccccccccccccccccaccccaaaaaaaaccccccccccaaacccccccccccccccccccchhhhhhhhhpppposssoooofffaaaaaccccc | ||||
| abccccccccaaaacccccaaccccccccccccccccccaaaaaccccccccccccccccccccccccaaccccccccccaaccccaaaaaaaacccccccccccccccccccccccccccccccccchhhhhhhhhgppooooooofffaaaaacccccc | ||||
| abaaccccccaaaacccccaacaaccccccccccccccccaaaaacccccccccccccccaacaaccaaaaaaccccaaaaacaacaaaaaaacccccccccccccccccccccccccccccccccccccchhhhhhgggooooooffffaaaaaaccccc | ||||
| abaaacccccaaaacccccaaaaaccccccccccccccccaaccccccccccccccccccaaaaaccaaaaaaccccaaaaaaaacccaaaaaccccccccccccccccccccccccaaacaacccccccccccccgggggooooffffccccaacccccc | ||||
| abaaaccccccccccccaaaaaaccccaaccccccccccccccccccaaacccccccccccaaaaaaaaaaaacaacccaaaaaccccaacaaacccccccccccccccccccccccaaaaaaccccccccccccccaggggggggfffcccccccccccc | ||||
| abaaaccccccccccccaaaaaaaacaaaaccccccccaaaccccccaaaacccccccccaaaaaaaaaaaaaaaaccaaaaacccccaaaaaccccccccccccccaaccccccccaaaaaaccccccccccccccaagggggggfccccccccccccca | ||||
| abaacccccccccccccaccaaaaacaaaaccccccccaaaccccccaaaacccccccccaaaaccaaaaaaaaaaccaacaaaccccccaaaccccccccccccaaaaaacccccaaaaaaacccccccccccccaaaaccggggcccccccccccccaa | ||||
| abaacccccccccccccccaaacaccaaaacccccaaaaaaaaccccaaaccccccccccccaaccaaaaaaaacccccccaacccccaacaaaaacccccccccaaaaaacccccaaaaaaaaccccccccccccaaaccccccccccccccccaaacaa | ||||
| abcccccccccccccccccaaccccccccccccccaaaaaaaaccccccccccccccccccccaaaaaaaaaaaccccccccccccccaaaaaaaacccccccccaaaaaacccccaaaaaaaaccccccccccccacaccccccccccccccccaaaaaa | ||||
| abccccccccccccccccccccccccccccccccccaaaaaacccccccccccccccccccccaaaaaaaaaaaaccccccccccccccaaaaaaccccccccccaaaaaccccccccaaacccccccccccccccccccccccccccccccccccaaaaa | ||||
							
								
								
									
										83
									
								
								day12/src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								day12/src/main.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| use std::env; | ||||
| use std::fs::File; | ||||
| use std::io::{self, BufRead}; | ||||
| use std::collections::BinaryHeap; | ||||
| use std::cmp::max; | ||||
|  | ||||
| fn get(map: &Vec<Vec<i64>>, coord: (usize, usize)) -> i64 { | ||||
|     map[coord.0 as usize][coord.1 as usize] | ||||
| } | ||||
|  | ||||
| fn main() { | ||||
|     let file = File::open(&env::args().nth(1).unwrap()).unwrap(); | ||||
|     let mut map: Vec<Vec<i64>> = Vec::new(); | ||||
|     let mut queue = BinaryHeap::new(); | ||||
|     let (mut start, mut end) = ((0, 0), (0, 0)); | ||||
|  | ||||
|     // parse input | ||||
|     for (i, line) in io::BufReader::new(file).lines().flatten().enumerate() { | ||||
|         let mut row: Vec<i64> = Vec::new(); | ||||
|         for (j, c) in line.chars().enumerate() { | ||||
|             match c { | ||||
|                 'S' => { start = (i, j); row.push('a' as i64); }, | ||||
|                 'E' => { end = (i, j); row.push('z' as i64); }, | ||||
|                 c => row.push(c as i64), | ||||
|             } | ||||
|         } | ||||
|         map.push(row); | ||||
|     } | ||||
|     let (height, width) = (map.len(), map[0].len()); | ||||
|     let mut costs = vec![vec![i64::MAX; width]; height]; | ||||
|     let heur: Vec<Vec<i64>> = (0..height) | ||||
|         .map(|i| (0..width) | ||||
|             .map(|j| | ||||
|                 max((i.abs_diff(end.0) + j.abs_diff(end.1)) as i64, | ||||
|                     get(&map, end) - get(&map, (i, j)))) | ||||
|             .collect()) | ||||
|         .collect(); | ||||
|          | ||||
|     queue.push((-heur[start.0][start.1], start)); | ||||
|     costs[start.0][start.1] = 0; | ||||
|  | ||||
|     // A* | ||||
|     let answer = loop { | ||||
|         // no route | ||||
|         if queue.is_empty() { | ||||
|             break None; | ||||
|         } | ||||
|  | ||||
|         let (_, (i, j)) = queue.pop().unwrap(); | ||||
|         let cost = get(&costs, (i, j)); | ||||
|  | ||||
|         // found destination | ||||
|         if (i, j) == end { | ||||
|             break Some(cost); | ||||
|         } | ||||
|  | ||||
|         // handle neighbors | ||||
|         let neighbors = [ | ||||
|             (i as i64, (j as i64) - 1), | ||||
|             (i as i64, (j as i64) + 1), | ||||
|             ((i as i64) - 1, j as i64), | ||||
|             ((i as i64) + 1, j as i64)]; | ||||
|         for (nexti, nextj) in neighbors { | ||||
|             if nexti < 0 || nextj < 0 | ||||
|                 || nexti >= height as i64 || nextj >= width as i64 | ||||
|                 || map[nexti as usize][nextj as usize] > map[i][j] + 1 | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             let nexti: usize = nexti as usize; | ||||
|             let nextj: usize = nextj as usize; | ||||
|             let new_cost = cost + 1; | ||||
|             if new_cost < costs[nexti][nextj] { | ||||
|                 costs[nexti][nextj] = new_cost; | ||||
|                 queue.retain(|(_, (ri, rj))| *ri != nexti || *rj != nextj); | ||||
|                 queue.push((-new_cost - heur[nexti][nextj], (nexti, nextj))); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     println!("= {:?}", answer); | ||||
| } | ||||
|  | ||||
							
								
								
									
										5
									
								
								day12/test.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								day12/test.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| Sabqponm | ||||
| abcryxxl | ||||
| accszExk | ||||
| acctuvwj | ||||
| abdefghi | ||||
		Reference in New Issue
	
	Block a user