LeetCode 面试题 08.02. 迷路的机器人

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

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值