剑指 Offer -- 机器人的运动范围(六十六)

机器人的运动范围(六十六)

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

代码(已在牛客上 AC)

思路: 使用 greater(threshold, i, j) 函数判断位置 (i, j) 处的坐标数位之和是否大于 threshold. 使用 seen[i][j] 判断判断 (i, j) 是否已经被访问过; 在 DFS 的过程中, 如果 dfs 没有直接 return, 那么就增加 res.

class Solution {
public:
    int movingCount(int threshold, int rows, int cols) {
        int res = 0;
        m = rows, n = cols;
        seen = vector<vector<bool>>(m, vector<bool>(n, false));
        dfs(res, threshold, 0, 0);
        return res;
    }
private:
    int m, n;
    vector<vector<bool>> seen;
    void dfs(int &res, int threshold, int row, int col) {
        if (row < 0 || row >= m || col < 0 || col >= n || seen[row][col]
            || greater(threshold, row, col)) return;
        seen[row][col] = true;
        res += 1;
        vector<vector<int>> dirs = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
        for (auto d : dirs) {
            int dx = d[0], dy = d[1];
            dfs(res, threshold, row + dx, col + dy);
        }
    }
    bool greater(int threshold, int i, int j) {
        int sum = 0;
        while (i || j) {
            sum += i % 10 + j % 10;
            i /= 10;
            j /= 10;
        }
        return (sum > threshold);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值