机器人的运动范围

你快乐吗?

Posted by bbkgl on November 4, 2019

船泊湘风晚

花谢烟雨迟

C++,dfs,遍历所有符合条件的点。

说实话,这种题目,我第一感觉就是这是道数学题,然后苦思冥想,没有找到规律,遂想先暴力试试,结果3ms,。。。

如果确实是这样的话,这题就没有难度了。

遍历所有满足条件的点,计数即可。

满足以下三个条件:

  • 在矩形范围内
  • 行坐标和列坐标的数位之和<=k
  • 没有遍历过

还有注意的就是一维和二维的转换,这个应该说了就懂。

下面是代码:

class Solution {
public:
    int movingCount(int threshold, int rows, int cols) {
        vector<bool> vis(rows * cols, false);
        if (threshold <= 0) return 0;
        return dfs(vis, 0, rows, cols, threshold);
    }
    
    int dfs(vector<bool> &vis, int curr, int &r, int &c, int &k) {
        vis[curr] = true;
        int dx[] = {1, -1, 0, 0};
        int dy[] = {0, 0, 1, -1};
        int sum = 1;
        for (int i = 0; i < 4; i++) {
            int tx = curr / c + dx[i], ty = curr % c + dy[i];
            int next = tx * c + ty;
            if (0 <= tx && tx < r && 0 <= ty &&  ty < c && !vis[next] && get_sum(tx) + get_sum(ty) <= k)
                sum += dfs(vis, next, r, c, k);
        }
        return sum;
    }
    
    int get_sum(int num) {
        int ans = 0;
        while (num) {
            ans += num % 10;
            num /= 10;
        }
        return ans;
    }
};