剑指Offer:面试题13——机器人的运动范围(java)

机器人的运动范围

题目描述

在这里插入图片描述

算法思路

  • 其实算法思路很明确,只要从【0】【0】开始进行四个方向的搜索即可,这也是回溯问题

  • 当机器人需要进入【i】【j】的时候,首先判断是否可以进入,

    • 如果不符合,那就返回 0
    • 如果符合,那就返回 1 + M1 + M2 + M3 + M4
    • M1,M2,M3,M4 是指四个方向搜索可以到达的格子个数
    • 所以这就是一个递归的写法

算法实现

  • 这里在实现回溯的时候遇见了困难,由于对递归的不熟悉,不知道到底返回什么?
  • 其实很简单,如果该位置符合,那么返回值至少为1,还要加上其余四个方向的格子个数
  • 如果该位置不符合,那就返回0即可
    public static int countNums(int[][] martix, int k){
        //矩阵的行列
        int m = martix.length;
        int n = martix[0].length;

        //记录是否已经走过  走过为1  没走过为0
        int[][] isVisited = new int[m][n];

//        int count = 0;
//        int i = ifCounrt(martix, 0, 0, isVisited, k, count);

        int count = ifCounrt(martix, 0, 0, isVisited, k);

        return  count;


    }

    public static int ifCounrt(int[][] martix, int row, int col, int[][] isVisited, int k){

        int count = 0;
        int m = martix.length;
        int n = martix[0].length;

        //判断该位置是否符合
        if(row < 0 || row >= m || col < 0 || col >= n || isVisited[row][col] == 1
                || check(row,col) > k){
            return 0;
        }
        //将该位置标志为已经走过
        isVisited[row][col] = 1;

        //计算 1 + 四个方向的格子个数
        count = 1 +
                ifCounrt(martix, row - 1, col, isVisited, k) +
                ifCounrt(martix, row + 1, col, isVisited, k) +
                ifCounrt(martix, row, col - 1, isVisited, k)+
                ifCounrt(martix, row, col + 1, isVisited, k);


        return count;

    }

	//检查是否符合
    public static int check(int row, int col){
        int sum  = 0;
        while(row != 0 || col != 0){
            sum += row % 10;
            row = row / 10;
            sum += col % 10;
            col = col / 10;
        }

        return  sum;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值