use std::collections::VecDeque;
pub fn shortest_path_grid(grid: &[Vec<u8>], start: (usize, usize), end: (usize, usize)) -> Option<usize> {
let rows = grid.len();
let cols = if rows > 0 { grid[0].len() } else { 0 };
let mut visited = vec![vec![false; cols]; rows];
let mut queue = VecDeque::new();
queue.push_back((start.0, start.1, 0));
visited[start.0][start.1] = true;
let dirs = [(-1,0),(1,0),(0,-1),(0,1)];
while let Some((r, c, d)) = queue.pop_front() {
if (r, c) == end { return Some(d); }
for (dr, dc) in dirs.iter() {
let nr = r as isize + dr;
let nc = c as isize + dc;
if nr >= 0 && nr < rows as isize && nc >= 0 && nc < cols as isize {
let (nr, nc) = (nr as usize, nc as usize);
if !visited[nr][nc] && grid[nr][nc] == 0 {
visited[nr][nc] = true;
queue.push_back((nr, nc, d+1));
}
}
}
}
None
}