Leetcode 1706、球会落在何处


深度优先搜索
终止条件
1、球被卡住
- 当前位置是1,并且当前位置是当前行最后一个位置,球无法出去,因为会被墙挡住;

- 当前位置是1,右边位置是-1,形成一个V,球会被卡住

grid[row][column] == 1 && (column == grid[0].length - 1 || grid[row][column + 1] == -1)
-
当前位置是-1,并且在当前行的第一个位置,会被墙卡住;

-
当前位置是-1,左边是1,形成V字,求会被卡住

grid[row][column] == -1 && (column == 0 || grid[row][column - 1] == 1))
2、球正常出去
- 当前在最后一行,当前位置为1,右边也为1,从右边那行出去
if(grid[row][column] == 1 && grid[row][column + 1] == 1 && row == grid.length - 1) {
return column + 1;
}
- 当前在最后一行,当前位置为-1,左边也为-1,从左边那行出去

if(grid[row][column] == -1 && grid[row][column - 1] == -1 && row == grid.length - 1) {
return column - 1;
}
非终止条件,继续遍历
if(grid[row][column] == 1) {
row++;
column++;
}else{
row++;
column--;
}
return dfs(row, column, grid);
完整代码
class Solution {
public int[] findBall(int[][] grid) {
int n = grid[0].length;
int[] result = new int[n];
for(int i = 0; i < n; i++) {
result[i] = dfs(0, i, grid);
}
return result;
}
public int dfs(int row, int column, int[][] grid) {
if((grid[row][column] == 1 && (column == grid[0].length - 1 || grid[row][column + 1] == -1))
|| (grid[row][column] == -1 && (column == 0 || grid[row][column - 1] == 1))) {
return -1;
}
if(grid[row][column] == 1 && grid[row][column + 1] == 1 && row == grid.length - 1) {
return column + 1;
}
if(grid[row][column] == -1 && grid[row][column - 1] == -1 && row == grid.length - 1) {
return column - 1;
}
if(grid[row][column] == 1) {
row++;
column++;
}else{
row++;
column--;
}
return dfs(row, column, grid);
}
}

本文解析了LeetCode题目1706中关于球在二维网格中的移动路径问题,重点讲解了如何使用深度优先搜索策略判断球是否会卡住并找出最终落点。通过终止条件和非终止条件的分析,展示了如何遍历网格并确定球的移动方向。
1304

被折叠的 条评论
为什么被折叠?



