机器人的运动范围(六十六)
题目描述:
地上有一个 m 行和 n 列的方格。一个机器人从坐标 (0,0) 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。 例如,当 k 为18时,机器人能够进入方格(35,37),因为 3+5+3+7 = 18。但是,它不能进入方格(35,38),因为 3+5+3+8 = 19。请问该机器人能够达到多少个格子?
代码(已在牛客上 AC)
思路: 使用 greater(threshold, i, j)
函数判断位置 (i, j)
处的坐标数位之和是否大于 threshold
. 使用 seen[i][j]
判断判断 (i, j)
是否已经被访问过; 在 DFS 的过程中, 如果 dfs
没有直接 return, 那么就增加 res
.
class Solution {
public:
int movingCount(int threshold, int rows, int cols) {
int res = 0;
m = rows, n = cols;
seen = vector<vector<bool>>(m, vector<bool>(n, false));
dfs(res, threshold, 0, 0);
return res;
}
private:
int m, n;
vector<vector<bool>> seen;
void dfs(int &res, int threshold, int row, int col) {
if (row < 0 || row >= m || col < 0 || col >= n || seen[row][col]
|| greater(threshold, row, col)) return;
seen[row][col] = true;
res += 1;
vector<vector<int>> dirs = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
for (auto d : dirs) {
int dx = d[0], dy = d[1];
dfs(res, threshold, row + dx, col + dy);
}
}
bool greater(int threshold, int i, int j) {
int sum = 0;
while (i || j) {
sum += i % 10 + j % 10;
i /= 10;
j /= 10;
}
return (sum > threshold);
}
};