题目

地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。

一个机器人从坐标 (0,0) 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。

但是不能进入行坐标和列坐标的数位之和大于 k 的格子。

请问该机器人能够达到多少个格子?

示例

  • 示例1
  • 输入:k=7, m=4, n=5
  • 输出:20
  • 示例2
  • 输入:k=18, m=40, n=40
  • 输出:1484

解释:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。

代码

解法:BFS

class Solution {
public:
    int getSum(int x,int y){ 
        return x / 10 + x % 10 + y / 10 + y % 10;
    }
    int movingCount(int m, int n, int k) {
        int res = 0;
        if(getSum(0,0) > k || !m || !n) return res;
        vector<vector<bool>> st(m,vector<bool>(n,false));   // 标志已访问
        int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1}; // 开方向数组
        queue<pair<int,int>> q;     // 存坐标
        q.push({0,0});
        st[0][0] = true;
        while(q.size()){
            auto t = q.front();
            q.pop();
            res++;
            int a,b;
            for(int i = 0; i < 4; i++){
                a = t.first + dx[i];
                b = t.second + dy[i];
                if(a >= 0 && a < m && b >= 0 && b < n && !st[a][b] && getSum(a,b) <= k){
                    q.push({a,b});
                    st[a][b] = true;
                }
            }
        }
        return res;
    }
};

代码分析:这道题也是第二次见了,以后可以照着这个思路写,没问题。详见文章

题目机器人的运动范围

最后修改:2022 年 01 月 20 日 08 : 41 PM
如果我的文章对你有用,请随意赞赏