剑指offer-66:机器人的运动范围
用dfs暴力递归求解,设置bool数组进行是否遍历的判断,并且需要注意机器人边界是否走出和所在位置横纵坐标各数位之和是否小于阈值。
使用vis[i][j]判重,每个点搜索一遍,一共存在mn个格子,因此时间复杂度为O(mn)。
具体代码如下:
class Solution {
public:
int movingCount(int threshold, int rows, int cols)
{
vector<vector<bool>> vis(rows, vector<bool>(cols)); //记录机器人是否经过
return dfs(threshold, 0, 0, vis);
}
int dfs(int th, int i, int j, vector<vector<bool>> &vis){ //形参参数传递,需在vis前加引用表明数组值已经修改
if(i < 0 || i >= vis.size() || j < 0 || j >= vis[i].size() || \
vis[i][j] ||(i/10 + i%10 + j/10 + j%10) > th)
return 0;
vis[i][j] = true;
return dfs(th, i+1, j, vis) + dfs(th, i-1, j, vis) \
+ dfs(th, i, j+1, vis) + dfs(th, i, j-1, vis) + 1; //opps
}
};