剑指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] 这个要灵活多变 因题而异了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)