题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
思路:
1、从(0,0)开始
2、判断当前格子是否遍历过是则执行步骤3
3、判断当前所在格子是否满足题设条件:行坐标和列坐标的数位之和小于等于k,是则执行步骤4
4、满足的格子数c加1,标记当前格子为遍历过的
5、当前格子右移一位递归的执行步骤2,当前格子上移一位递归的执行步骤2,
代码:
class Solution {
public:
//满足题设的格子个数
int c;
//省的传参麻烦
int boder, row, col;
bool IsAvailable(int i, int j)
{
int sum = 0;
while (i != 0)
{
sum += i % 10;
i /= 10;
}
while (j != 0)
{
sum += j % 10;
j /= 10;
}
if (sum <= boder)
return true;
return false;
}
//判断输入的数是否满足题设
void Cells(vector<vector<int>>& A,int i, int j)
{
if (i < row && j < col)
{
if (A[i][j] == 0)
{
if (IsAvailable(i, j))
{
//当前格子(i,j)满足条件
++c;
A[i][j] = 1;
//递归判断右边一格是否满足条件
if (i + 1 < row)
{
Cells(A, i + 1, j);
}
//递归判断上边一格是否满足条件
if (j + 1 < col)
{
Cells(A, i, j + 1);
}
}
}
}
}
int movingCount(int threshold, int rows, int cols)
{
boder = threshold;
row = rows;
col = cols;
c = 0;
vector<vector<int>> A(row, vector<int>(col));
//格子从0开始
Cells(A,0, 0);
return c;
}
};