1.机器人的运动范围
地上有一个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。请问该机器人能够到达多少个格子?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof
思路:回溯算法

class Solution {
public:
    int movingCount(int m, int n, int k) {
           if(m<=0||n<=0||k<0) return 0;
           vector<bool> visited(m*n,0);//定义数组以记录访问过的点
           int count=Cal(m,n,0,0,k,visited);//从左上角开始搜索
           return count;
    }
    int Cal(int m,int n,int row,int col,int k,vector<bool> &visited)
    {
        int count=0;
        if(Check(m,n,row,col,k,visited))
        {
            visited[row*n+col]=1;
            count+=1+Cal(m,n,row+1,col,k,visited)
            +Cal(m,n,row,col+1,k,visited)
            +Cal(m,n,row-1,col,k,visited)
            +Cal(m,n,row,col-1,k,visited);//如果第一个点符合要求,就递归寻找其他的点
        }
        return count;

    }
    bool Check(int m,int n,int row,int col,int k,vector<bool> &visited)
    {
        int flag=false;
        if(row>=0&&row<m&&col>=0&&col<n&&visited[row*n+col]==0&&getDigit(row)+getDigit(col)<=k)
        {
            flag=true;//严格符合以上条件才算合格
        }
        return flag;
    }
    int getDigit(int m)//算数的函数
    {
        int sum=0;
        while(m)
        {
            sum+=m%10;
            m=m/10;
        }
        return sum;
    }
};