安全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に、別のブログを参照してくださいすることができます。