Loading

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

  地上有一个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。请问该机器人能够到达多少个格子?

  利用一个queue 广度优先进行检索,从当前节点一层一层的往外扩展。

class Solution {
public:
    vector<pair<int, int>>dir = { {0,1},{1,0} };
    int getsum(int x)
    {
        int res = 0;
        while (x)
        {
            res += x % 10;
            x = x / 10;
        }
        return res;
    }
    int movingCount(int m, int n, int k) 
    {
        if (!k) return 1;
        int ans = 1;
        vector<vector<int>>dp(m, vector<int>(n, 0));
        queue<pair<int, int>>ss; //广度优先进行检索
        dp[0][0] = 1;
        ss.push({ 0,0 });
  
    while (ss.size() > 0)
    {
        auto tmp = ss.front();
        int old_i = tmp.first;
        int old_j = tmp.second;
        ss.pop();
        for (auto it : dir)
        {
            int cur_i = old_i + it.first;
            int cur_j = old_j + it.second;
            if(cur_i>=0 && cur_i<m &&cur_j>=0 &&cur_j<n)
            {
                if(getsum(cur_i)+getsum(cur_j)<=k &&dp[cur_i][cur_j]==0)
                {
                    dp[cur_i][cur_j] = 1;
                    ans++;
                    ss.push({ cur_i,cur_j });
                }
            }
          
        }
    }
    //cout << ans << endl;
    return ans;

    }
};

 

posted @ 2021-11-24 16:19  aalanwyr  阅读(10)  评论(0编辑  收藏  举报