题目地址: https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/
使用深度优先搜索,去查找符合条件的点的个数
上下左右(其实这题没必要搜索上左)
dfs(i + 1, j)
dfs(i - 1, j)
dfs(i, j - 1)
dfs(i, j + 1)
终止条件:
- 当搜索到的二维数组下标的位置越界 则终止
- 当发现节点已经被搜索过则终止
- 节点不符合题目条件则终止
if(i < 0 || j < 0 || i >= m || j >= n
|| sums(i) + sums(j) > k || visited[i][j] == true){
return 0;
}
最后结果需要将所有搜索得到的值 相加
1 + dfs(i + 1, j) + dfs(i - 1, j) + dfs(i, j - 1) + dfs(i, j + 1);
class Solution {
int n, m, k;
boolean[][] visited;
public int movingCount(int m, int n, int k) {
if(m < 0 || n < 0 ||k < 0 ) return 0;
//数位之和小于 k 使用dfs
this.visited = new boolean[m][n];
this.k = k;
this.n = n;
this.m = m;
return dfs(0, 0);
}
int dfs(int i, int j){
//临界值
if(i < 0 || j < 0 || i >= m || j >= n || sums(i) + sums(j) > k || visited[i][j] == true){
return 0;
}
visited[i][j] = true;
//上下左右
return 1 + dfs(i + 1, j) + dfs(i - 1, j) + dfs(i, j - 1) + dfs(i, j + 1);
}
//计算数位之和
int sums(int num){
int sum = 0;
while(num != 0){
sum += num % 10;
num = num / 10;
}
return sum;
}
}