《剑指offer》面试题13. 机器人的运动范围

问题描述

地上有一个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
示例 1:
输入:m = 3, n = 1, k = 0
输出:1
提示:
1 <= n,m <= 100
0 <= k <= 20

代码

class Solution {
public:
    int movingCount(int m, int n, int k) {
        int ans,i,j;
        vector<vector<bool>> flag(m,vector<bool>(n,false));
        return check(0,0,m,n,k,flag);
    }
    int check(int indx,int indy,int m,int n,int &k,vector<vector<bool>> &flag)
    {
        if(indx < 0|| indx >= m|| indy < 0|| indy >= n||compsum(indx)+compsum(indy) > k|| flag[indx][indy])
            return 0;
        flag[indx][indy] = true;
        return check(indx+1,indy,m,n,k,flag)+
               check(indx,indy+1,m,n,k,flag)+
               check(indx-1,indy,m,n,k,flag)+
               check(indx,indy-1,m,n,k,flag)+1;
    }
    int compsum(int x)
    {
        int sum = 0;
        while(x > 0)
        {
            sum += x%10;
            x /= 10;
        }
        return sum;
    }
};

结果:

执行用时 :4 ms, 在所有 C++ 提交中击败了75.21%的用户
内存消耗 :8 MB, 在所有 C++ 提交中击败了100.00%的用户

代码2

class Solution {
public:
    int movingCount(int m, int n, int k) {
        int ans,i,j;
        vector<vector<bool>> flag(m,vector<bool>(n,false));
        return check(0,0,m,n,k,flag);
    }
    int check(int indx,int indy,int m,int n,int &k,vector<vector<bool>> &flag)
    {
        if( indx >= m||  indy >= n||compsum(indx)+compsum(indy) > k|| flag[indx][indy])
            return 0;
        flag[indx][indy] = true;
        return check(indx+1,indy,m,n,k,flag)+
               check(indx,indy+1,m,n,k,flag)+1;
    }
    int compsum(int x)
    {
        int sum = 0;
        while(x > 0)
        {
            sum += x%10;
            x /= 10;
        }
        return sum;
    }
};

结果:

执行用时 :4 ms, 在所有 C++ 提交中击败了75.21%的用户
内存消耗 :6.6 MB, 在所有 C++ 提交中击败了100.00%的用户
posted @ 2020-04-12 17:55  曲径通霄  阅读(127)  评论(0编辑  收藏  举报