java算法:机器人的运动范围

问题

  • 地上有一个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。请问该机器人能够到达多少个格子?

解决

class Solution {
    public int movingCount(int m, int n, int k) {
        if(k==0) return 1;                  //如果k=0,则能够达到的格子自由第1个
        int end=1;                          //定义格子计数器
        boolean[][] ren=new boolean[m][n];    //定义机器人能够走的格子位置的数组
        ren[0][0]=true;                     //因为前面已经定义了end=1所以ren的第一个位置是一定为真的
        for(int i=0;i<m;++i){
            for(int j=0;j<n;++j){                       //两个循环确定能够走的格子,如果能够走,end就+1,不能就进行其余的格子验证
                if((i==0&&j==0)||check(i)+check(j)>k) continue;      //如果处于ren或者位数大于k时直接进行下一次判断
                if(j-1>=0){
                    ren[i][j]|=ren[i][j-1];     //  |=位运算符
                }
                if(i-1>=0){
                    ren[i][j]|=ren[i-1][j];
                }
                end+=ren[i][j]?1:0;
            }
        }
        return end;
    }
     private int check(int x){      //获取m、n的位数方法
            int ans=0;
            while(x!=0){
                ans+=x%10;
                x/=10;
            }
            return ans;
        }
}
//能够走的格子的位数之和要小于等于k

// 回溯算法:我的理解就是先从上往下,不符合再从下网上,然后继续上述步骤直达遇到符合的

总结

posted @   new_monkey  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示