ソードフィンガーオファー-------ロボットの可動域

ここに画像の説明を挿入

トピックリンク!

アイデア:この
質問も一般的な検索質問です。bfsまたはdfsで記述できます。ここではbfsを使用します。ポイント(0,0)から開始し、このポイントから開始して周囲をトラバースします。下、左、右ですが、この質問は下または右に減らすことができます。次に、2次元配列を使用してポイントをマークし、一致するポイントをキューに入れて、ループします。

コード:

class Solution {
    
    
    // 计算 x 的数位之和
    int get(int x) {
    
    
        int res=0;
        for (; x; x /= 10) {
    
    
            res += x % 10;
        }
        return res;
    }
public:
    int movingCount(int m, int n, int k) {
    
    
        if (!k) return 1;
        queue<pair<int,int> > Q;
        // 向右和向下的方向数组
        int dx[2] = {
    
    0, 1};
        int dy[2] = {
    
    1, 0};
        vector<vector<int> > vis(m, vector<int>(n, 0));
        Q.push(make_pair(0, 0));
        vis[0][0] = 1;
        int ans = 1;
        while (!Q.empty()) {
    
    
            auto [x, y] = Q.front();
            Q.pop();
            for (int i = 0; i < 2; ++i) {
    
    
                int tx = dx[i] + x;
                int ty = dy[i] + y;
                if (tx < 0 || tx >= m || ty < 0 || ty >= n || vis[tx][ty] || get(tx) + get(ty) > k) continue;
                Q.push(make_pair(tx, ty));
                vis[tx][ty] = 1;
                ans++;
            }
        }
        return ans;
    }
};

おすすめ

転載: blog.csdn.net/weixin_43743711/article/details/115079502