//sum记录机器人能到达的格子数
//创建记忆化数组,初始化全为0
//从(0,0)位置开始搜索
//返回sum
//搜索函数,dfs
//越界或数位和大于k或已访问判断
//标记已访问,sum加1
//向下和向右搜索
//计算数位和
//通过深度优先搜索判断机器人能到达的格子数,并对搜索过程做记忆化优化。
public class jianzhiOffer13 {
//sum记录机器人能到达的格子数
private int sum = 0;
public int movingCount(int m, int n, int k) {
//创建记忆化数组,初始化全为0
int[][] fg = new int[m][n];
//从(0,0)位置开始搜索
search(fg,0,0,k);
//返回sum
return sum;
}
//搜索函数,dfs
public void search(int[][] fg,int i, int j, int k){
//越界或数位和大于k或已访问判断
if (i < 0 || i >= fg.length || j < 0 || j >= fg[0].length ||
swh(i) + swh(j) > k || fg[i][j] == 1){
return;
}
//标记已访问,sum加1
fg[i][j] = 1;
sum += 1;
//向下和向右搜索
search(fg, i + 1, j, k);
search(fg, i, j + 1, k);
}
//计算数位和
public int swh(int i){
int sum = 0;
while (i != 0){
sum += i % 10;
i /= 10;
}
return sum;
}
}