题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
class Solution {
public:
//DFS,遍历的点在标记数组vis设为true后不复位,保证没有重复计算
int movingCount(int threshold, int rows, int cols)
{
if (rows < 0 || cols < 0)
return 0;
bool *vis = new bool[rows*cols];
for (int i = 0; i < rows*cols; ++i)
vis[i] = false;
cnt = 0;
dfs(threshold, rows, cols, 0, vis);
delete vis;
return cnt;
}
private:
int dir[4][2] = {{1,0},{-1,0},{0,-1},{0,1}};
int cnt = 0;
int getDigitSum(int x)
{
int sum = 0;
while (x)
{
sum += x%10;
x /= 10;
}
return sum;
}
void dfs(int k, int rows, int cols, int now, bool *vis)
{
if (now < 0 || now >= rows*cols || vis[now])
return;
vis[now] = true;
int r = now/cols, c = now%cols;
int sum = getDigitSum(r) + getDigitSum(c);
if (sum > k)
return;
++cnt;
for(int i = 0; i < 4; ++i)
dfs(k, rows, cols, (r+dir[i][0])*cols + c+dir[i][1], vis);
}
};