剑指OFFER_机器人的运动范围
剑指OFFER_机器人的运动范围
题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
思路
一开始我的思路是遍历每个格子,计算符合要求的格子数量;
后来发现可能不符合要求的格子会割裂整个地图,导致有些格子虽然满足条件,但是机器人无法到达;
所以设置一个递归函数,把能到达的格子判断一遍即可,代码如下:
代码
class Solution {
public:
int w;
int v;
int limit;
int *vis;
int ans;
bool check(int x, int y) {
int res = 0;
string str = to_string(x) + to_string(y);
for (char &s:str) {
int tmp = s-48;
res += tmp;
}
if (res <= limit) {
return true;
} else {
return false;
}
}
void dfs(int x, int y) {
if (x<0 || x>=v || y>=w || y<0)
return;
int pos = x*w+y;
if (vis[pos] != 0)
return;
if (check(x, y)) {
++ans;
vis[pos] = 1;
} else {
vis[pos] = -1;
return;
}
dfs(x-1, y);
dfs(x,y-1);
dfs(x+1, y);
dfs(x, y+1);
}
int movingCount(int threshold, int rows, int cols)
{
ans = 0;
w = cols; v = rows; limit = threshold;
vis = new int[rows*cols];
memset(vis, 0, rows*cols*sizeof(int));
dfs(0, 0);
return ans;
}
};