pub fn path_sum(grid: &[Vec<i32>], start: (usize, usize), end: (usize, usize), sum: i32) -> bool {
let rows = grid.len();
let cols = if rows > 0 { grid[0].len() } else { 0 };
#[allow(clippy::too_many_arguments)]
fn dfs(
grid: &[Vec<i32>],
r: usize,
c: usize,
end: (usize, usize),
sum: i32,
acc: i32,
rows: usize,
cols: usize,
visited: &mut Vec<Vec<bool>>,
) -> bool {
if r >= rows || c >= cols || visited[r][c] {
return false;
}
let acc = acc + grid[r][c];
if (r, c) == end {
return acc == sum;
}
visited[r][c] = true;
let dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)];
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
&& dfs(
grid,
nr as usize,
nc as usize,
end,
sum,
acc,
rows,
cols,
visited,
) {
visited[r][c] = false;
return true;
}
}
visited[r][c] = false;
false
}
let mut visited = vec![vec![false; cols]; rows];
dfs(
grid,
start.0,
start.1,
end,
sum,
0,
rows,
cols,
&mut visited,
)
}