ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

剑指 Offer 13. 机器人的运动范围  

2021-05-16 21:30:35  阅读:86  来源: 互联网

标签:count 10 13 Offer int sum 机器人 ++ flag


地上有一个m行n列的方格,从坐标[0,0]到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,
 它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。
 例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。
 请问该机器人能够到达多少个格子?
 https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/

    //递推方法:搜索方向可以缩减为向右和向下,因为每个位置都可以由它上边或左边的位置移动一步得到
    public int movingCount1(int m, int n, int k) {
        boolean[][] flag = new boolean[m][n];
        flag[0][0] = true;
        int count = 1;
        //遍历每一个位置
        for (int i = 0; i < m; i++){
            for (int j = 0; j < n; j++){

                //计算数位之和
                if (i == 0 && j == 0){
                    continue;
                }
                int sum = 0;
                int p = i;
                int q = j;
                while(p != 0){
                    sum += (p % 10);
                    p = p / 10;
                }
                while(q != 0){
                    sum += (q % 10);
                    q = q / 10;
                }

                //如果当前数位和大于k,机器人不能到达这个位置
                if(sum > k){
                    continue;
                }
                //如果数位和小于等于k,能不能到达这个位置取决于能不能到达它的上边或左边的位置
                if (i - 1 >= 0){
                    flag[i][j] |= flag[i - 1][j];
                }

                if (j - 1 >= 0){
                    flag[i][j] |= flag[i][j - 1];
                }

                //如果能到这个点,count++
                if (flag[i][j]){
                    count ++;
                }
            }
        }

        return count;
    }

    //回溯法:用一个大小为m*n的数组记录每一个位置能不能到达,假设机器人现在在[i][j]处,i和j都在下标范围内,
    // 且flag[i][j]是false(表示没来过这里),计算数位之和,如果大于k就直接返回,否则就
    // 标记flag[i][j]为true,按顺序分别向右,下,左,上走(左和上其实可以忽略,因为每一个位置都可以由
    // 它上方的位置向下走一步,或左边的位置向右走一步得到)
    public int movingCount(int m, int n, int k) {
        boolean[][] flag = new boolean[m][n];
        move(flag,0,0,k);
        int count = 0;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(flag[i][j]){
                    count++;
                }
            }
        }
        return count;
    }

    public void move(boolean[][] flag, int i, int j, int k){
        //如果下标不在合法范围内或者当前位置已经被置为true,就直接返回
        if(i < 0 || i >= flag.length || j < 0 || j >= flag[0].length || flag[i][j] == true){
            return;
        }

        //计算数位之和
        int sum = 0;
        int p = i;
        int q = j;
        while(p != 0){
            sum += (p % 10);
            p = p / 10;
        }
        while(q != 0){
            sum += (q % 10);
            q = q / 10;
        }

        //如果数位和大于k,就直接返回
        if(sum > k){
            return;
        }
        //数位之和不大于k,标记当前位置为true
        flag[i][j] = true;
        //分别向左,上,下,右走
        move(flag, i - 1, j, k);
        move(flag, i, j - 1, k);
        move(flag, i + 1, j, k);
        move(flag, i, j + 1, k);
    }

 

标签:count,10,13,Offer,int,sum,机器人,++,flag
来源: https://blog.csdn.net/weixin_45798182/article/details/116903166

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有