机器人的运动范围

题目链接

思路

  1. 用visited记录访问过的节点
  2. 用isMatch来判断是否能访问该节点
  3. 如果在矩阵呢 并且满足条件1,2说明该点是可以访问的节点 那么计数并且visited标记
  4. 对能访问的四个方向进行递归遍历
    其实如果把isMatch为false的节点置为访问过但不计数的话能避免一定的重复计算
public class Solution {
    public int count = 0;
    public int movingCount(int threshold, int rows, int cols)
    {
        if(cols<0  || rows<0 || threshold<0){
            return 0;
        }
        boolean[][]visted = new boolean[rows][cols];
        CountHelper(threshold, rows, cols, 0, 0, visted);

        return count;
    }
    public void CountHelper(int threshold, int rows, int cols,int row,int col,boolean[][]visted){
        if((row>=0 && row<rows) && (col>=0 && col<cols) && !visted[row][col] && isMatch(threshold, row, col)){
            visted[row][col] = true;
            ++count;
            CountHelper(threshold, rows, cols, row-1, col, visted);
            CountHelper(threshold, rows, cols, row+1, col, visted);
            CountHelper(threshold, rows, cols, row, col-1, visted);
            CountHelper(threshold, rows, cols, row, col+1, visted);
        }
    }
    //返回true代表能通过 否则表示不能通过
    public boolean isMatch(int threshold,int rows,int cols){
        int sum = sumOfDigits(rows)+sumOfDigits(cols);
        if(sum<=threshold){
            return true;
        }
        return false;
    }
    public int  sumOfDigits(int n){
        int sum = 0;
        while(n!=0){
            sum += n%10;
            n/=10;
        }
        return sum;
    }
}

你可能感兴趣的:(递归)