剑指 Offer 13. 机器人的运动范围
思路一:利用dfs深度优先搜索
-
首先确定递归搜索的终止条件
1:i,j超出范围
2:数位之和大于k
3:(i,j)被访问过
-
接下来进行dfs
可以进行一个dfs减枝优化,由于从0,0开始,则只要判断右边和下边即可,因为左和上一定会在搜索过程中被包括
class Solution {
public:
// set<vector<int>> visited; //用来存访问过的数
//获取行列坐标之和
int getSum(int i,int j){
int resall=0;
while(i){ //当为0时候退出循环
resall += i%10; //求最后一位余数
i/=10; //去除最后一位
}
while(j){
resall += j%10; //求最后一位余数
j/=10; //去除最后一位
}
return resall;
}
int dfs(int i,int j,int m,int n,int k,vector<vector<bool>>& flag){ //写一个深度优先遍历
// vector<int> temp={i,j};
//确定dfs终止条件
//1:i,j超范围 i>=m||j>=n
//2:数位和大于k getSum(i,j)>k
//3:i,j的坐标被访问过 visited.find(temp)!=visited.end()
if(i>=m||j>=n||getSum(i,j)>k||flag[i][j]){return 0;}
// visited.insert(temp);
flag[i][j] = true;
//如果从(0,0)开始不用考虑向上移动的,没有回溯
int res = 1 + dfs(i+1,j,m,n,k,flag) +dfs(i,j+1,m,n,k,flag);
return res;
}
int movingCount(int m, int n, int k) {
vector<vector<bool>> flag(m, vector<bool>(n, false));
int res=0;
res = dfs(0,0,m,n,k,flag);
return res;
}
};