题目链接
算法思路
这题和下面的问题的思路类似
DFS模板团灭矩阵中的搜索问题
都是采用dfs来解题
这题很大不同的是,它并不需要撤销选择。
如何判断它不需要撤销选择?
就是看它走的路径是否还可以走,如果不能走了,则不需要撤销选择。
就拿这题来说吧,求机器人最多能达到多少个路径?这就意味着机器人每走一格就算1,并且不能回退。
这题还需要注意的点是,机器人是从(0,0)开始,意味着它只能向右或者向下,这点很重要。
还有一个知识点,如何求一个数的各个位数之和?比如95,它的位数之和是9+5=14。其实只要不断对这个数取余,取余之后再相除就可以获得。比如95%10 = 5;95/10=7;9%10=9。就把各个位数取出来了
int sum = 0;
while(a!=0){
sum += a%10;
a /= 10;
}
代码实现
public class Solution {
int m;
int n;
boolean[][] visited;
public int movingCount(int threshold, int rows, int cols) {
m = rows;
n = cols;
visited = new boolean[m][n];
return dfs(threshold,0,0);
}
private int numAdd(int a,int b){
int sum = 0;
while(a!=0){
sum += a%10;
a /= 10;
}
while(b!=0){
sum += b%10;
b /= 10;
}
return sum;
}
private int dfs(int k,int i,int j){
if(i<0 || i>= m || j<0 || j>=n || k<numAdd(i,j) || visited[i][j]){
return 0;
}
visited[i][j] = true;
return 1 + dfs(k,i+1,j) + dfs(k,i,j+1);
}
}