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

题目

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

数据范围:0≤threshold≤15 ,1≤rows,cols≤100

进阶:空间复杂度 O(nm) ,时间复杂度 O(nm)

示例1

输入:1,2,3

返回值:3

示例2

输入:0,1,3

返回值:1

示例3

输入:10,1,100

返回值:29

说明:0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28 这29种,后面的0,29,0,30以及0,31等等是无法到达的

示例4

输入:5,10,10

返回值:21

解答

源代码

java 复制代码
import java.util.*;

public class Solution {
    public int movingCount(int threshold, int rows, int cols) {
        boolean[][] flag = new boolean[rows][cols];
        return dfs(threshold, rows, cols, 0, 0, flag);
    }

    public int dfs(int threshold, int rows, int cols, int i, int j, boolean[][] flag) {
        if (i < 0 || i >= rows || j < 0 || j >= cols || flag[i][j] || cal(i) + cal(j) > threshold) {
            return 0;
        }

        flag[i][j] = true;
        return 1 + dfs(threshold, rows, cols, i - 1, j, flag)
                        + dfs(threshold, rows, cols, i + 1, j, flag)
                        + dfs(threshold, rows, cols, i, j - 1, flag)
                        + dfs(threshold, rows, cols, i, j + 1, flag);
    }

    public int cal(int number) {
        int sum = 0;
        while (number != 0) {
            sum += number % 10;
            number /= 10;
        }

        return sum;
    }
}

总结

迷宫问题,回溯就完事,记得做标记避免重复经过方格。

这里要注意求的是机器人的运动"范围"而不是一条最大路径,所以每次应该加上上下左右路径的所有长度,而不是只加上一条最长的路径。

相关推荐
weixin_460443562 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w5 小时前
什么是AOP
java
Cc.Y6 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川6 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸6 小时前
排序算法介绍
python·算法·排序算法
paopaokaka_luck6 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787056 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev6 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha6 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞6 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计