剑指offer 24. 机器人的运动范围-java实现

bfs宽度优先搜索

原题链接

地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。

一个机器人从坐标 (0,0) 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。

但是不能进入行坐标和列坐标的数位之和大于 k 的格子。

请问该机器人能够达到多少个格子?

注意:

0<=m<=50
0<=n<=50
0<=k<=100

代码案例1:输入:k=7, m=4, n=5
输出:20

样例2 :输入:k=18, m=40, n=40
输出:1484
解释:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。
但是,它不能进入方格(35,38),因为3+5+3+8 = 19。

题解-O(nm)

这是一个典型的宽度优先搜索问题,我们从 (0, 0) 点开始,每次朝上下左右四个方向扩展新的节点即可。

扩展时需要注意新的节点需要满足如下条件:

之前没有遍历过,这个可以用个bool数组来判断;
没有走出边界;
横纵坐标的各位数字之和小于 k;
最后答案就是所有遍历过的合法的节点个数。

时间复杂度
每个节点最多只会入队一次,所以时间复杂度不会超过方格中的节点个数。
最坏情况下会遍历方格中的所有点,所以时间复杂度就是 O(nm)O(nm)。

class Solution {
     
    public int movingCount(int threshold, int rows, int cols)
    {
        boolean[][] stu = new boolean[55][55];//判断每个点是否走过
        int [] dx = {0,-1,0,1};
        int[] dy = {1,0,-1,0};
         if(rows < 1 || cols < 1) return 0 ;//p判断出界情况
         Queue<Node> q =  new LinkedList<>();//创建队列  并初始化
         q.add(new Node(0,0));
         int ans = 0;//记录走了多少个机器人
         while(!q.isEmpty()){
            Node t =  q.poll();
            if(stu[t.x][t.y] || get_sum(t.x,t.y) > threshold) continue;
             ans++ ;
            stu[t.x][t.y] = true ;
            for(int i = 0 ; i< 4 ; i++){
                int a = t.x + dx[i];
                int b = t.y + dy[i];
                if(a >= 0 && a < rows && b >= 0 && b < cols   ){
                        q.add(new Node(a,b));                         
                }                
            }
         }
         return ans ;
    }
    public  int get_sum(int a , int b ){//得到横坐标和纵坐标的数位之和
        int res = 0 ; 
        while(a > 0 ){
            res += a % 10 ;
            a /= 10 ;
        }
         while(b > 0 ){
            res += b % 10 ;
            b /= 10 ;
        }
        return res ;        
    }    
    static class Node{
        int x ;
        int y ;
        public Node(int x , int y ){
            this.x = x ;
            this.y = y ;
        }
    }
}

总结

如果在stu[0][0]= true 那么在后面if语句的判断中要加上stu[a][b] = true
但是判断方式就没有stu[t.x][t.y] 这个要灵活多变 因题而异了

posted @   依嘫  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示