题目
类型:DFS
解题思路
数据范围只有 100,直接模拟每个球从顶部的某列出发,最终到底底部哪列即可
使用 r 和 c 表示小球当前所处的位置,受重力影响,在不被卡住的情况下,r 会持续自增,直到到达底部,而 c 的变化,则是取决于当前挡板grid[r][c]的方向,若grid[r][c]为 1,则小球的下一个位置为(r + 1, c + 1);
若grid[r][c]为 -1 ,则下一位置为(r + 1, c - 1) ,即可以统一表示为(r + 1, c + grid[r][c]) 。
当且仅当小球在本次移动过程中没被卡住,才能继续移动。
即只有 c + grid[r][c] 没有超过矩阵的左右边界(没有被边界卡住),或者grid[r][c]和 grid[r][c + grid[r][c]] 同向(不形成夹角),小球方能继续移动。
代码
class Solution {int m, n;int[][] g;public int[] findBall(int[][] grid) {g = grid;m = g.length; n = g[0].length;int[] ans = new int[n];for (int i = 0; i < n; i++) ans[i] = getVal(i);return ans;}int getVal(int x) {int r = 0, c = x;while (r < m) {int ne = c + g[r][c];if (ne < 0 || ne >= n) return -1;if (g[r][c] != g[r][ne]) return -1;r++; c = ne;}return c;}}
