剑指offer66 机器人的运动范围(与题65类似)


剑指offer66

机器人的运动范围(与题65类似)

题目描述

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

示例

输入

5,10,10

输出

21

思路

回溯法

核心思路:

1.从(0,0)开始走,每成功走一步标记当前位置为true,然后从当前位置往四个方向探索,返回1 + 4 个方向的探索值之和。

2.探索时,判断当前节点是否可达的标准为:

  1. 当前节点在矩阵内;
  2. 当前节点未被访问过;
  3. 当前节点满足limit限制。

代码

public class Solution {
    public int movingCount(int threshold, int rows, int cols)
    {
        boolean[][] visited = new boolean[rows][cols];
        return countSteps(threshold,rows,cols,0,0,visited);
    }

    public int countSteps(int limit,int rows,int cols,int i,int j,boolean[][] visited){
        if(    //递归终止条件
            i<0
            || i>=rows
            || j<0
            || j>=cols
            || visited[i][j]
            || bitSum(i)+bitSum(j)>limit
        )return 0;
        //要走的位置置为true,表示已经走过了
        visited[i][j] = true;
        //递
        //无需归,因为上面的递归体内已经加了return 0,返回到调用递归时也直接return
        return countSteps(limit,rows,cols,i,j-1,visited)
            + countSteps(limit,rows,cols,i,j+1,visited)
            + countSteps(limit,rows,cols,i-1,j,visited)
            + countSteps(limit,rows,cols,i+1,j,visited)
            + 1;
    }

    public int bitSum(int num){
        int sum = 0;
        while(num!=0){
            sum += num%10;
            num /= 10;
        }
        return sum;
    }
}

文章作者: Hailong Gao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hailong Gao !
评论
  目录