迷路的机器人
设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。
网格中的障碍物和空位置分别用 1 和 0 来表示。
返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。如果没有可行的路径,返回空数组。
class Solution {
public List<List<Integer>> pathWithObstacles(int[][] obstacleGrid) {
List<List<Integer>> ans = new ArrayList<>();
dfs(ans, obstacleGrid, 0 , 0);
return ans;
}
public boolean dfs(List<List<Integer>> ans, int[][] obstacleGrid, int r, int c){
if (r >= obstacleGrid.length || c >= obstacleGrid[0].length){
return false;
}
if (obstacleGrid[r][c] == 1){
return false;
}
ans.add(Arrays.asList(r,c));
obstacleGrid[r][c] = 1;//经过的地方置为1
if (r == obstacleGrid.length-1 && c == obstacleGrid[0].length-1){
return true;
}
if (dfs(ans, obstacleGrid, r+1, c)){
return true;
}
if (dfs(ans, obstacleGrid, r, c+1)){
return true;
}
ans.remove(ans.size()-1);
return false;
}
}