LeetCode 面试题 08.02. 迷路的机器人
设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,
但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。
网格中的障碍物和空位置分别用 1 和 0 来表示。
返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。如果没有可行的路径,返回空数组。
输入: [ [0,0,0], [0,1,0], [0,0,0] ] 输出:
[[0,0],[0,1],[0,2],[1,2],[2,2]] 解释: 输入中标粗的位置即为输出表示的路径,即 0行0列(左上角) ->
0行1列 -> 0行2列 -> 1行2列 -> 2行2列(右下角)来源:力扣(LeetCode)
题解:
DFS深度搜索+记忆化
1.给一个与网格大小的二维布尔数组,记录当前网格是否被走过
2.注意条件,边界,是否到达终点,是否下和右都能走即可
public class pathWithObstacles {
private int m;
private int n;
private int[][] grid;
public List<List<Integer>> pathWithObstacles(int[][] obstacleGrid){
this.grid=obstacleGrid;
m=obstacleGrid.length;
n=obstacleGrid[0].length;
List<List<Integer>> ans=new ArrayList<>();
dfs(0,0,new boolean[m][n],ans);
return ans;
}
private boolean dfs(int row,int col,boolean[][] visite,List<List<Integer>> path){
//边界问题
// 当前网格不是障碍点
//是否访问过当前格子
if (row<0||col<0||row>=m||col>=n||visite[row][col]||grid[row][col]==1){
return false;
}
//加入到路径中
path.add(Arrays.asList(row,col));
//是否到达终点
if (row==m-1&&col==n-1){
return true;
}
//对遍历过的设置为true,避免重复计算
visite[row][col]=true;
//遍历下一节点和右节点
if (dfs(row+1,col,visite,path)||dfs(row,col+1,visite,path)){
return true;
}
//如果走到这一步还没有返回的话,说明不满足上诉条件,既当前节点的下和右都有障碍
path.remove(path.size()-1);
return false;
}
}