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

发布了28 篇原创文章 · 获赞 34 · 访问量 2670

猜你喜欢

转载自blog.csdn.net/weixin_44289697/article/details/104720341
今日推荐