剑指offer java版 test66—机器人运动路径

  1. 题目:

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

  1. 思路:首先不能直接遍历整个数组,判断小于18的格子有多少个,因为我们得保证路径是连通的,要不然机器人无法到达。为了保证是连通路径,采用递归的方式,模拟机器人先走,从起点开始,一格一格的找,找到所有路径所有能到达格子的总和。
  2. 代码
 class Solution {
    public int movingCount(int threshold, int rows, int cols)
    {
        int flag[][]=new int[rows][cols];// 建一个数组,来记录是否已经走过,和路径规划中的禁忌表一个道理
                                        // 初始为0,走过的点 记为1
        return helper(0,0,rows,cols,flag,threshold);//从起点开始
    }

    private int helper(int i,int j,int rows,int cols,int[][] flag,int threshold){
        //如果越界了,或者当前点的阈值大于给定的,或者这个点时已经走过的点,那么返回0
        if(i<0||i>=rows||j < 0 || j >= cols||numSum(i)+numSum(j)>threshold|| flag[i][j] == 1){
            return 0;
        }
        flag[i][j]=1;//表示该点已经走过;
        //返回 往上下左右四个方向不断找的结果,再加上自身这个1.总数即为所求。
        return helper(i-1,j,rows,cols,flag,threshold)
                +helper(i+1,j,rows,cols,flag,threshold)
                +helper(i,j-1,rows,cols,flag,threshold)
                +helper(i,j+1,rows,cols,flag,threshold)
                +1;
    }
     private int numSum(int i) {
        int sum = 0;
        do{
            sum += i%10;        }
        while((i = i/10) > 0);
        return sum;    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值