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;
}
};
京公网安备 11010502036488号