安全offer13を証明するために、ロボットの動きの範囲

安全offer13を証明するために、ロボットの動きの範囲
ここに画像を挿入説明

class Solution {
public:
    int getSingleSum(int x){
        int s=0;
        while(x){
            s+=x%10;
            x/=10;
        }
        return s;
    }
    int getSum(pair<int,int> p){
        return getSingleSum(p.first)+getSingleSum(p.second);
    }
    int movingCount(int m, int n, int k) {
        //比较大的范围用宽度优先遍历,不用深度优先遍历,否则会栈溢出
        int res=0;
        if(!m||!n) return 0;

        vector<vector<bool>> st(m,vector<bool>(n));         //判重矩阵
        queue<pair<int,int>> q;         //宽搜队列

        int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
        q.push({0,0});
        while(q.size()){
            auto t = q.front();
            q.pop();

            if(getSum(t)>k||st[t.first][t.second]) continue;
            res++;
            st[t.first][t.second]=true;

            for(int i=0;i<4;i++){
                int x=t.first+dx[i],y=t.second+dy[i];
                if(x>=0 && x<m && y>=0 && y<n)
                q.push(make_pair(x,y));            
            }
        }
        return res;
    }
};

アルゴリズム的思考は:あなたはすべての要素をトラバースしたいので、これはBFSの古典的な問題であり、時間の複雑さは、要素の数であるO(M * N)、です。全体的に、全体の検索を解決するためのアイデアは、キューを定義することで、その後、キュー要素を締結し、しばらく(q.size())、サイクルを継続するキュー要素があると判定され、その後、トラバースないのポイントを見つけます、キューに追加。同様のアイデアは、バイナリツリートラバーサルレベルを持って、バイナリツリーに関連する問題について、私はあなたが私のブログを参照することができ、中にDFSとBFS話題LeetCodeに、別のブログを参照してくださいすることができます。

公開された28元の記事 ウォン称賛34 ビュー2670

おすすめ

転載: blog.csdn.net/weixin_44289697/article/details/104720341