1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
struct Solution;
impl Solution {
pub fn find_ball(grid: Vec<Vec<i32>>) -> Vec<i32> {
let n = grid[0].len();
if n == 1 {
return vec![-1];
}
(0..n).map(|i| {Self::exits(&grid, 0, i)}).collect()
}
fn exits(grid: &Vec<Vec<i32>>, row: usize, i: usize) -> i32 {
let (m, n) = (grid.len(), grid[0].len());
if i == usize::MAX ||i >= n {
return -1;
}
let i2 = i + grid[row][i] as usize;
if i2 >= n || i2 == usize::MAX {
return -1;
}
let (dir1, dir2) = (grid[row][i], grid[row][i2]);
if dir1 != dir2 {
return -1;
}
if row == m - 1 {
return i2 as i32;
}
Self::exits(&grid, row + 1, i2)
}
}
fn main() {
let grid = vec![vec![1,1,1,-1,-1],
vec![1,1,1,-1,-1],
vec![-1,-1,-1,1,1],
vec![1,1,1,1,-1],
vec![-1,-1,-1,-1,-1]];
print!("{:?}", Solution::find_ball(grid));
}
|