剑指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),也就是元素的个数,因为要遍历到所有的元素。总体而言,宽搜的解题思路就是定义一个队列,然后把元素输入到队列中,判断条件是while(q.size()),队列中有元素就继续循环,然后寻找没有遍历到的点,加入到队列中去。类似的思想有二叉树的层次遍历,关于二叉树的相关问题,可以参考我另一篇博客,关于LeetCode中的DFS和BFS专题,可以参考我的博客。