pub fn flood_fill<T: Clone + PartialEq>(grid: &mut Vec<Vec<T>>, sr: usize, sc: usize, new_val: T) {
let rows = grid.len();
let cols = if rows > 0 { grid[0].len() } else { 0 };
let orig = grid[sr][sc].clone();
if orig == new_val { return; }
fn dfs<T: Clone + PartialEq>(grid: &mut Vec<Vec<T>>, r: usize, c: usize, orig: &T, new_val: &T, rows: usize, cols: usize) {
if r >= rows || c >= cols || grid[r][c] != *orig { return; }
grid[r][c] = new_val.clone();
if r > 0 { dfs(grid, r-1, c, orig, new_val, rows, cols); }
if c > 0 { dfs(grid, r, c-1, orig, new_val, rows, cols); }
if r+1 < rows { dfs(grid, r+1, c, orig, new_val, rows, cols); }
if c+1 < cols { dfs(grid, r, c+1, orig, new_val, rows, cols); }
}
dfs(grid, sr, sc, &orig, &new_val, rows, cols);
}