深度优先搜索
深度优先其实是一种递归,广度优先一般是使用队列实现的
深度优先递归模板:
输入当前状态i,j
1.判断i,j是否越界、i、j中的元素是否不满足题目要求,i、j是否访问过,是,则返回
2.将当前i、j设置为访问过
3.进行递归,下探到下一层,并记录结果(不需要重复查找,则可以在此返回,需要重复查找,例如寻找某个路径,那么两条不同的路径会重复经过某个点,而机器人运动范围则只是统计坐标范围,坐标不可以重复计算)
4.恢复未访问状态(如果需要重复查找的话)
5.返回结果
public class Main {
public static void main(String[] args) {
int m = 2,n = 3,k = 1;
boolean[][] v = new boolean[m][n];
int res = jude(0,0,m,n,k,v);
System.out.println(res);
}
public static int jude(int i,int j,int m,int n,int k,boolean[][] v) {
if(i < 0||j < 0|| i >= m||j >=n|| coun(i,j) > k || v[i][j] == true)
//判断条件是否满足,第1步
return 0;
v[i][j] = true;//设置为访问过,第2步,避免重复计数
return 1+jude(i-1,j,m,n,k,v)+jude(i+1,j,m,n,k,v)+
jude(i,j+1,m,n,k,v)+jude(i,j-1,m,n,k,v);//下探到下一层,并返回,第3步,+1是为了计算当前层的这一步
}
//计算数位和
public static int coun(int i,int j) {
int sum = 0;
while(i != 0) {
sum += i%10;
i = i/10;
}
while(j != 0) {
sum += j%10;
j = j/10;
}
return sum;
}
}