diff --git a/solution/0900-0999/0909.Snakes and Ladders/README.md b/solution/0900-0999/0909.Snakes and Ladders/README.md index f260b58f25623..f5feac9a8def4 100644 --- a/solution/0900-0999/0909.Snakes and Ladders/README.md +++ b/solution/0900-0999/0909.Snakes and Ladders/README.md @@ -279,6 +279,52 @@ function snakesAndLadders(board: number[][]): number { } ``` +#### Rust + +```rust +use std::collections::{HashSet, VecDeque}; + +impl Solution { + pub fn snakes_and_ladders(board: Vec>) -> i32 { + let n = board.len(); + let m = (n * n) as i32; + let mut q = VecDeque::new(); + q.push_back(1); + let mut vis = HashSet::new(); + vis.insert(1); + let mut ans = 0; + + while !q.is_empty() { + for _ in 0..q.len() { + let x = q.pop_front().unwrap(); + if x == m { + return ans; + } + for y in x + 1..=i32::min(x + 6, m) { + let (mut i, mut j) = ((y - 1) / n as i32, (y - 1) % n as i32); + if i % 2 == 1 { + j = (n as i32 - 1) - j; + } + i = (n as i32 - 1) - i; + let z = if board[i as usize][j as usize] == -1 { + y + } else { + board[i as usize][j as usize] + }; + if !vis.contains(&z) { + vis.insert(z); + q.push_back(z); + } + } + } + ans += 1; + } + + -1 + } +} +``` + diff --git a/solution/0900-0999/0909.Snakes and Ladders/README_EN.md b/solution/0900-0999/0909.Snakes and Ladders/README_EN.md index 9daef974915b4..7ba0104747f4c 100644 --- a/solution/0900-0999/0909.Snakes and Ladders/README_EN.md +++ b/solution/0900-0999/0909.Snakes and Ladders/README_EN.md @@ -277,6 +277,52 @@ function snakesAndLadders(board: number[][]): number { } ``` +#### Rust + +```rust +use std::collections::{HashSet, VecDeque}; + +impl Solution { + pub fn snakes_and_ladders(board: Vec>) -> i32 { + let n = board.len(); + let m = (n * n) as i32; + let mut q = VecDeque::new(); + q.push_back(1); + let mut vis = HashSet::new(); + vis.insert(1); + let mut ans = 0; + + while !q.is_empty() { + for _ in 0..q.len() { + let x = q.pop_front().unwrap(); + if x == m { + return ans; + } + for y in x + 1..=i32::min(x + 6, m) { + let (mut i, mut j) = ((y - 1) / n as i32, (y - 1) % n as i32); + if i % 2 == 1 { + j = (n as i32 - 1) - j; + } + i = (n as i32 - 1) - i; + let z = if board[i as usize][j as usize] == -1 { + y + } else { + board[i as usize][j as usize] + }; + if !vis.contains(&z) { + vis.insert(z); + q.push_back(z); + } + } + } + ans += 1; + } + + -1 + } +} +``` + diff --git a/solution/0900-0999/0909.Snakes and Ladders/Solution.rs b/solution/0900-0999/0909.Snakes and Ladders/Solution.rs new file mode 100644 index 0000000000000..ae7d7243fcb6d --- /dev/null +++ b/solution/0900-0999/0909.Snakes and Ladders/Solution.rs @@ -0,0 +1,41 @@ +use std::collections::{HashSet, VecDeque}; + +impl Solution { + pub fn snakes_and_ladders(board: Vec>) -> i32 { + let n = board.len(); + let m = (n * n) as i32; + let mut q = VecDeque::new(); + q.push_back(1); + let mut vis = HashSet::new(); + vis.insert(1); + let mut ans = 0; + + while !q.is_empty() { + for _ in 0..q.len() { + let x = q.pop_front().unwrap(); + if x == m { + return ans; + } + for y in x + 1..=i32::min(x + 6, m) { + let (mut i, mut j) = ((y - 1) / n as i32, (y - 1) % n as i32); + if i % 2 == 1 { + j = (n as i32 - 1) - j; + } + i = (n as i32 - 1) - i; + let z = if board[i as usize][j as usize] == -1 { + y + } else { + board[i as usize][j as usize] + }; + if !vis.contains(&z) { + vis.insert(z); + q.push_back(z); + } + } + } + ans += 1; + } + + -1 + } +}