• 机器人的活动范围


            地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

    回溯:

    private int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
    private int count = 0;
    private int rows;
    private int cols;
    private int threshold;
    private int[][] digitSum;
    public int movingCount(int threshold, int rows, int cols){
        this.rows = rows;
        this.cols = cols;
        this.threshold = threshold;
        boolean[][] marked = new boolean[rows][cols];
        initDigitSum();
        dfs(marked, 0, 0);
        return count;
    }
    private void dfs(boolean[][] marked, int r, int c){
        if (r < 0 || r >= rows || c < 0 || c >= cols || marked[r][c]){
            return;
        }
        marked[r][c] = true;
        if (this.digitSum[r][c] > threshold){
            return;
        }
        count++;
        for (int[] n : digitSum){
            dfs(marked, r + n[0], c + n[1]);
        }
    }
    private void initDigitSum(){
        int[] digitSumOne = new int[Math.max(rows, cols)];
        for (int i = 0; i < digitSumOne.length; i++){
            int n = i;
            while (n > 0){
                digitSumOne[i] += n % 10;
                n /= 10;
            }
        }
        this.digitSum = new int[rows][cols];
        for (int i = 0; i < rows; i++){
            for (int j = 0; j < cols; j++){
                this.digitSum[i][j] = digitSumOne[i] + digitSumOne[j];
            }
        }
    }
  • 相关阅读:
    BZOJ 3744 Gty的妹子序列
    BZOJ 3872 Ant colony
    BZOJ 1087 互不侵犯
    BZOJ 1070 修车
    BZOJ 2654 tree
    BZOJ 3243 向量内积
    1003 NOIP 模拟赛Day2 城市建设
    CF865D Buy Low Sell High
    CF444A DZY Loves Physics
    Luogu 4310 绝世好题
  • 原文地址:https://www.cnblogs.com/earthhouge/p/11437219.html
Copyright © 2020-2023  润新知