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);
}
}