剑指—机器人的运动范围

625 阅读1分钟

剑指 Offer 13. 机器人的运动范围

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

示例 1:

输入:m = 2, n = 3, k = 1
输出:3

示例 2:

输入:m = 3, n = 1, k = 0
输出:1

思路:

  • 首先分析题目在一个二维数组中
    • 那么我们是否需要上下左右的去走
    • 还只是就可以解决
    • 当确定好在二维数组的走势以后
    • 再根据题意确定好辅助函数的递归出口
    • 最后根据这道题确定辅助数组
class Solution {
    boolean[][] vis;
    public int movingCount(int m, int n, int k) {
        vis = new boolean[m][n];

        return dfs(0,0,m,n,k);
    }

    int dfs(int x,int y,int m,int n,int k) {
        // 出口条件
        if (x >= m || y>= n || vis[x][y] || 
        (x%10 + x/10 + y%10 + y/10) > k){
            return 0;
        }

        // 标记被访问过
        vis[x][y] = true;

        return 1 + dfs(x + 1,y,m,n,k) + dfs(x,y + 1,m,n,k);
    }

}

image.png