面试题13. 机器人的运动范围(Leetcode每日一题-2020.04.08)

Problem

地上有一个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。请问该机器人能够到达多少个格子?

Example1

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

Example2

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

Solution

BFS

class Solution {
public:
    int movingCount(int m, int n, int k) {
        if(m == 0 && n == 0)
            return 0;

        int ret = 1;
        if(!isValid(0,0,k))
            return ret;

        queue<pair<int,int>> q;
        q.push(pair<int,int>(0,0));
        vector<vector<int>> visited(m,vector<int>(n,0));
        visited[0][0] = 1;

        vector<pair<int,int>> dir = {{1,0},{0,1}};

        while(!q.empty())
        {
            auto cur = q.front();
            q.pop();

            for(int i = 0;i<dir.size();++i)
            {
                int x = cur.first + dir[i].first;
                int y = cur.second + dir[i].second;

                if(x>=0 && x<m && y>=0 && y<n && !visited[x][y] && isValid(x,y,k))
                {
                    q.push(pair<int,int>(x,y));
                    visited[x][y] = 1;
                    ++ret;
                }
            }
        }

        return ret;

    }

    bool isValid(int x,int y,int k)
    {
        int sum = digitSum(x) + digitSum(y);
        if(sum > k)
            return false;
        return true;
    }

    int digitSum(int x)
    {
        int sum = 0;
        while(x)
        {
            sum += x % 10;
            x = x/10;
        }

        return sum;
    }
};
发布了547 篇原创文章 · 获赞 217 · 访问量 56万+

猜你喜欢

转载自blog.csdn.net/sjt091110317/article/details/105400377