题目

类型:DFS
image.png

解题思路

数据范围只有 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]] 同向(不形成夹角),小球方能继续移动。

代码

  1. class Solution {
  2. int m, n;
  3. int[][] g;
  4. public int[] findBall(int[][] grid) {
  5. g = grid;
  6. m = g.length; n = g[0].length;
  7. int[] ans = new int[n];
  8. for (int i = 0; i < n; i++) ans[i] = getVal(i);
  9. return ans;
  10. }
  11. int getVal(int x) {
  12. int r = 0, c = x;
  13. while (r < m) {
  14. int ne = c + g[r][c];
  15. if (ne < 0 || ne >= n) return -1;
  16. if (g[r][c] != g[r][ne]) return -1;
  17. r++; c = ne;
  18. }
  19. return c;
  20. }
  21. }