From c0009583cbf4fc43f10a1ab1341ee8b405c1aebf Mon Sep 17 00:00:00 2001
From: yanglbme <szuyanglb@outlook.com>
Date: Sat, 31 May 2025 15:54:00 +0800
Subject: [PATCH] feat: add solutions to lc problem: No.0909

No.0909.Snakes and Ladders
---
 .../0909.Snakes and Ladders/README.md         | 46 +++++++++++++++++++
 .../0909.Snakes and Ladders/README_EN.md      | 46 +++++++++++++++++++
 .../0909.Snakes and Ladders/Solution.rs       | 41 +++++++++++++++++
 3 files changed, 133 insertions(+)
 create mode 100644 solution/0900-0999/0909.Snakes and Ladders/Solution.rs

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<Vec<i32>>) -> 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
+    }
+}
+```
+
 <!-- tabs:end -->
 
 <!-- solution:end -->
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<Vec<i32>>) -> 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
+    }
+}
+```
+
 <!-- tabs:end -->
 
 <!-- solution:end -->
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<Vec<i32>>) -> 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
+    }
+}