牛客剑指offer 机器人的运动范围

Posted *^O^*—*^O^*

tags:

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

题目描述

地上有一个rows行和cols列的方格。坐标从 [0,0] 到 [rows-1,cols-1]。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于threshold的格子。 例如,当threshold为18时,机器人能够进入方格[35,37],因为3+5+3+7 = 18。但是,它不能进入方格[35,38],因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
范围:
1 <= rows, cols<= 100
0 <= threshold <= 20
在这里插入图片描述

题目链接

解题思路

需要采取搜索策略,这里我采用的是深度搜索,从第一个位置出发,只要是符合的且能够到达的,就加入,为了防止重复加入的位置出现,需要再来一个一样的二维数组来存放标志位,只要访问过了就需要改变标志位。

代码示例

public class Solution {
    public int movingCount(int threshold, int rows, int cols) {
        //临时变量visited记录格子是否被访问过
        boolean[][] visited = new boolean[rows][cols];
        return dfs(0, 0, rows, cols, threshold, visited);
    }

    public int dfs(int i, int j, int rows, int cols, int threshold, boolean[][] visited) {
        //i >= rows || j >= cols是边界条件的判断,threshold < sum(i, j)判断当前格子坐标是否
        // 满足条件,visited[i][j]判断这个格子是否被访问过
        if (i >= rows || j >= cols || threshold < sum(i, j) || visited[i][j])
            return 0;
        //标注这个格子被访问过
        visited[i][j] = true;
        //沿着当前格子的右边和下边继续访问
        return 1 + dfs(i + 1, j, rows, cols, threshold, visited) +
                dfs(i, j + 1, rows, cols, threshold, visited);
    }

    //计算两个坐标数字的和
    private int sum(int i, int j) {
        int sum = 0;
        //计算坐标i所有数字的和
        while (i != 0) {
            sum += i % 10;
            i /= 10;
        }
        //计算坐标j所有数字的和
        while (j != 0) {
            sum += j % 10;
            j /= 10;
        }
        return sum;
    }
}

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

牛客剑指offer 剪绳子

牛客剑指offer 剪绳子

牛客剑指offer刷题记录

牛客剑指offer刷题记录

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

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