1. 地上有一个mn列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?<br />来源:力扣(LeetCode)<br />链接:[https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof](https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2875045/1628576148067-980f62df-9a3f-4b19-af70-e0e2cdaf3819.png#clientId=uf143fbd0-7674-4&from=paste&height=280&id=u9db4adcd&margin=%5Bobject%20Object%5D&name=image.png&originHeight=430&originWidth=646&originalType=binary&ratio=1&size=203612&status=done&style=none&taskId=u3ab1b24e-15da-4c6e-9bcf-ee0ae5b3dd5&width=420.9977111816406)

    思路
    看图可知,只需要当前格子向右移动一格(i+1)或者向下移动(j+1);向左或者向上没有意义,总左上角开始的话。已经走过的路不需要走。
    判断是否可达

    1. // 位数和计算
    2. int bitsSum(int n){
    3. int sum = 0;
    4. while(n!=0){
    5. sum += n%10;
    6. n /=10;
    7. }
    8. return sum;
    9. }

    在进行dfs的时候退出的条件:

    1. // 越界,不可达,或者访问过
    2. if(i>=m || j>=n || k<(bitsSum(i)+bitsSum(j)) || visites[i][j]) return 0;
    1. 其中不可访问过需要使用一个boolean[][] visites 来记录。如果访问过将状态修改为true。并+1。<br />所以
    1. visites[i][j] = true;
    2. return 1+dfs(i+1,j)+dfs(i,j+1);

    代码

    1. class Solution {
    2. int m,n,k;
    3. boolean[][] visites;
    4. public int movingCount(int m, int n, int k) {
    5. this.m = m;this.n = n;this.k = k;
    6. // 保存访问状态信息
    7. this.visites = new boolean[m][n];
    8. return dfs(0,0);
    9. }
    10. int dfs(int i, int j){
    11. if(i>=m || j>=n || k<(bitsSum(i)+bitsSum(j)) || visites[i][j]) return 0;
    12. visites[i][j] = true;
    13. return 1+dfs(i+1,j)+dfs(i,j+1);
    14. }
    15. // 位数和计算
    16. int bitsSum(int n){
    17. int sum = 0;
    18. while(n!=0){
    19. sum += n%10;
    20. n /=10;
    21. }
    22. return sum;
    23. }
    24. }