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

Posted Rose J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法剑指 Offer 13.机器人的运动范围相关的知识,希望对你有一定的参考价值。

1.题目

地上有一个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

提示:

  • 1 <= n,m <= 100
  • 0 <= k <= 20

2.思路

参考博客:https://blog.csdn.net/YouMing_Li/article/details/114270397

解题思路

1.深度优先搜索(dfs)

通过判断该坐标是否越界、该坐标是否访问过、该坐标数位之和是否大于k来判断机器人能否进入该格子,不管能否进入,都将该格子标记为已访问,且退出当前调用栈后,不用回退标记数组的状态,因为本身就是要访问完所有能够访问到的格子。如果机器人能够进入坐标为(x,y)的格子,而后再判断机器人能否进入该坐标相邻的4个格子,直到所有能遍历到的格子都遍历结束。

3.答案

class Solution 
    private int count = 0;

    public int movingCount(int m, int n, int k) 
        if (m < 0 || n < 0) return -1;
        boolean[][] isVisited = new boolean[m][n];
        dfs(m, n, isVisited, 0, 0, k);
        return count;
    

    private void dfs(int m, int n, boolean[][] isVisited, int x, int y, int k) 
        if (x >= m || x < 0 || y >= n || y < 0 || isVisited[x][y]) return;
        isVisited[x][y] = true;
        if (getSum(x, y) <= k) 
            count++;
            int[] dx = -1, 1, 0, 0;
            int[] dy = 0, 0, -1, 1;
            for (int i = 0; i < 4; i++) 
                int a = x + dx[i];
                int b = y + dy[i];
                dfs(m, n, isVisited, a, b, k);

            
         else 
            return;
        
    

    private int getSum(int x, int y) 
        int res = 0;
        while (x > 0) 
            res += x % 10;
            x /= 10;
        
        while (y > 0) 
            res += y % 10;
            y /= 10;
        
        return res;
    



以上是关于算法剑指 Offer 13.机器人的运动范围的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

剑指offer--13机器人运动范围

《剑指Offer——12.矩阵中的路径,13.机器人的运动范围》代码

LeetCode(剑指 Offer)- 13. 机器人的运动范围