美文网首页
LeetCode:机器人的运动范围

LeetCode:机器人的运动范围

作者: 是takiku啊 | 来源:发表于2021-05-07 22:24 被阅读0次

    地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

    示例 1:

    输入:m = 2, n = 3, k = 1
    输出:3
    

    示例 2:

    输入:m = 3, n = 1, k = 0
    输出:1
    

    提示:

    1 <= n,m <= 100
    0 <= k <= 20
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof

    思路:

    本题是求机器人的运动范围,即求机器人所能达到的区域,是否能联想到广度搜索,从一个点散开来搜索,形象类似于一滴水引起的涟漪,从一个点往四周搜索到符合的点放入队列,再从队列依次取出去搜索它四周符合的点,再放入队列,这样不就完成了广度搜索了嘛,这里需要注意的是访问过得点无需再访问了,我们访问过了可以给他标记一下。

    代码题解:

    #include<iostream>
    #include<queue>
    #include<vector>
    using namespace std;
    int getNumSum(int n, int total) { //得到一个数字的每个位上的数字之和
        if (n/10 == 0 )
        {
            return total + n;
        }
        return getNumSum(n / 10, total + n % 10);
    }
    int movingCount(int m, int n, int k) {
        if (k == 0) 
        {
            return 1;
        }
        vector<vector<int>> vis(m,vector<int>(n)); //已经访问过的点了
        queue <pair<int, int>> Q; //待扩展开来的队列
    
        int dx[2] = { 0,1 }; // x 方向 不向右或者向右
        int dy[2] = { 1,0 }; //y 方向 向下或者不向下 ,和dx合起来就是向右或者向下搜索
    
        Q.push(make_pair(0, 0)); //将第一个点放入
        vis[0][0] = 1; //坐标为[0,0]标记已访问
        int sum = 1; //起始范围为1
        while (!Q.empty()) //如果队列不为空代表可继续搜索
        {
            pair<int,int> member = Q.front(); //队首的点赋值
            Q.pop();//弹出队首
            for (int i = 0; i < 2; i++) //遍历两个方向
            {
                int x = member.first + dx[i];
                int y = member.second + dy[i];
                if (x<0 || y<0 || x>=m || y>=n ||((getNumSum(x,0)+ getNumSum(y,0))>k)||(vis[x][y])) //不符合条件,如果访问越界或者2坐标位数相加大于k或者已经访问过了continue
                {
                    continue;
                }
                //符合条件
                Q.push(make_pair(x, y)); //加入队列
                sum++; //范围+1
                vis[x][y] = 1; //标记已访问
            }
        }
        return sum;
    }
    int main() {
        cout << movingCount(2, 3, 1) << endl;
        cout << movingCount(3, 1, 0) << endl;
    }
    

    相关文章

      网友评论

          本文标题:LeetCode:机器人的运动范围

          本文链接:https://www.haomeiwen.com/subject/vsxydltx.html