problems(rs): add “1091. Shortest Path in Binary Matrix”
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
f4bda0ca05
commit
078993071a
1 changed files with 106 additions and 0 deletions
106
problems/shortest-path-in-binary-matrix.rs
Normal file
106
problems/shortest-path-in-binary-matrix.rs
Normal file
|
@ -0,0 +1,106 @@
|
|||
use std::collections::VecDeque;
|
||||
use std::convert::TryInto;
|
||||
|
||||
struct Solution {}
|
||||
impl Solution {
|
||||
pub fn shortest_path_binary_matrix(grid: Vec<Vec<i32>>) -> i32 {
|
||||
let n = grid.len();
|
||||
|
||||
// create an array of distances
|
||||
let mut distances = grid.clone();
|
||||
for y in 0..n {
|
||||
for x in 0..n {
|
||||
distances[y][x] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// initialize the start with an initial distance
|
||||
let mut q: VecDeque<(usize, usize)> = VecDeque::new();
|
||||
if grid[0][0] == 0 {
|
||||
distances[0][0] = 1;
|
||||
q.push_back((0, 0));
|
||||
}
|
||||
|
||||
while let Some((y, x)) = q.pop_front() {
|
||||
if (y, x) == (n - 1, n - 1) {
|
||||
break;
|
||||
}
|
||||
|
||||
for (next_y, next_x) in (-1_isize..=1)
|
||||
.flat_map(|dy| (-1_isize..=1).map(move |dx| (dy, dx)))
|
||||
.map(|(dy, dx)| (y as isize + dy, x as isize + dx))
|
||||
.filter(|&(next_y, next_x)| {
|
||||
(next_y, next_x) != (y as isize, x as isize)
|
||||
&& next_y >= 0
|
||||
&& next_y < n.try_into().unwrap()
|
||||
&& next_x >= 0
|
||||
&& next_x < n.try_into().unwrap()
|
||||
})
|
||||
{
|
||||
let (next_y, next_x) = (next_y as usize, next_x as usize);
|
||||
|
||||
if distances[next_y][next_x] == -1 && grid[next_y][next_x] == 0 {
|
||||
distances[next_y][next_x] = distances[y][x] + 1;
|
||||
q.push_back((
|
||||
(next_y as isize).try_into().unwrap(),
|
||||
(next_x as isize).try_into().unwrap(),
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
distances[n - 1][n - 1]
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
assert_eq!(
|
||||
Solution::shortest_path_binary_matrix(vec![vec![0, 1], vec![1, 0]]),
|
||||
2
|
||||
);
|
||||
assert_eq!(
|
||||
Solution::shortest_path_binary_matrix(vec![vec![0, 0, 0], vec![1, 1, 0], vec![1, 1, 0]]),
|
||||
4
|
||||
);
|
||||
assert_eq!(
|
||||
Solution::shortest_path_binary_matrix(vec![vec![1, 0, 0], vec![1, 1, 0], vec![1, 1, 0]]),
|
||||
-1
|
||||
);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn example_1() {
|
||||
assert_eq!(
|
||||
Solution::shortest_path_binary_matrix(vec![vec![0, 1], vec![1, 0]]),
|
||||
2
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn example_2() {
|
||||
assert_eq!(
|
||||
Solution::shortest_path_binary_matrix(vec![
|
||||
vec![0, 0, 0],
|
||||
vec![1, 1, 0],
|
||||
vec![1, 1, 0]
|
||||
]),
|
||||
4
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn example_3() {
|
||||
assert_eq!(
|
||||
Solution::shortest_path_binary_matrix(vec![
|
||||
vec![1, 0, 0],
|
||||
vec![1, 1, 0],
|
||||
vec![1, 1, 0]
|
||||
]),
|
||||
-1
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue