aboutsummaryrefslogtreecommitdiff
path: root/where_will_ball_fall.rs
blob: 6a1bb58c843810531628091848eb5f45dc53c2f8 (plain)
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));
}