剑指 Offer 13. 机器人的运动范围
思路:DFS
- 递归参数:当前元素在矩阵行列索引i和j
- 终止条件:越界或者数位和超出目标值或当前元素已经访问,返回
- 递归过程:
- 标记当前单元格:将索引(i,j)标记访问过,ans值加一
- 搜索下一个单元格:按上下左右方向进行搜索
- 返回值:ans
class Solution {
public:
int movingCount(int m, int n, int k) {
int ans=0;
vector<vector<bool>> isVisited(m,vector<bool>(n,false));
dfs(0,0,isVisited,k,ans);
return ans;
}
void dfs(int i,int j,vector<vector<bool>>& isVisited,int k,int& ans){
if(i<0||i>=isVisited.size()||j<0||j>=isVisited[0].size()||isVisited[i][j]||!test(i,j,k)) return;
ans++;
isVisited[i][j]=true;
dfs(i-1,j,isVisited,k,ans);
dfs(i+1,j,isVisited,k,ans);
dfs(i,j-1,isVisited,k,ans);
dfs(i,j+1,isVisited,k,ans);
}
bool test(int i,int j,int k){
int sum=0;
while(i){
sum+=i%10;
i/=10;
}
while(j){
sum+=j%10;
j/=10;
}
return sum<=k;
}
};
时间复杂度 O(M*N) M,N是矩阵行列数
空间复杂度 O(M*N)