首页 > 其他分享 >《剑指offer》第13题 机器人的运动范围

《剑指offer》第13题 机器人的运动范围

时间:2023-10-08 14:32:09浏览次数:25  
标签:13 rows 格子 offer int 机器人 cols col row

一、题目描述

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够进入多少个格子?《剑指offer》第13题 机器人的运动范围_一维数组

二、题解

和面试题12类似,方格可以看作一个m*n的矩阵,同样在这个矩阵中,除边界上的格子外,其它格子都有4个相邻的格子。

机器人从坐标(0,0)开始移动,当它准备进入坐标为(i,j)的格子时,通过检查坐标的位数和来判断机器人是否能够进入。如果机器人能够进入坐标为(i,j)的格子,再判断它能否进入4个相邻的格子(i,j-1),(i,j+1),(i-1,j),(i+1,j)。

当进入某个位置时,应当标记这个位置已经访问过,避免之后重复访问,可以设计一个boolean数组,这里设计一个二维数组,也可以通过压缩设计成一维数组来表征一个位置是否被访问过。下面的解答采用二维数组,因为这样记录横纵坐标第i行第j列是否被访问,更为直观。

代码如下:

public class Solution {
    public int movingCount(int threshold, int rows, int cols) {
        if (rows <= 0 || cols <= 0 || threshold < 0)
            return 0;

        boolean[][] isVisited = new boolean[rows][cols];//标记
        int count = movingCountCore(threshold, rows, cols, 0, 0, isVisited);
        return count;
    }

    private int movingCountCore(int threshold,int rows,int cols,
                                int row,int col, boolean[][] isVisited) {
        if (row < 0 || col < 0 || row >= rows || col >= cols || isVisited[row][col]
                || cal(row) + cal(col) > threshold)
            return 0;
        isVisited[row][col] = true;
        return 1 + movingCountCore(threshold, rows, cols, row - 1, col, isVisited)
                + movingCountCore(threshold, rows, cols, row + 1, col, isVisited)
                + movingCountCore(threshold, rows, cols, row, col - 1, isVisited)
                + movingCountCore(threshold, rows, cols, row, col + 1, isVisited);
    }

    private int cal(int num) {
        int sum = 0;
        while (num > 0) {
            sum += num % 10;
            num /= 10;
        }
        return sum;
    }
}

标签:13,rows,格子,offer,int,机器人,cols,col,row
From: https://blog.51cto.com/u_16244372/7756172

相关文章

  • Python入门示例系列13 列表
    Python入门示例系列13列表 序列序列是Python中最基本的数据结构。Python包含6中内建的序列,即列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。序列通用的操作包括:索引([])、长度(len)、组合(序列相加)、重复(乘法)、分片(切片[:])、检查成员(in,notin)、遍历、最小值(mi......
  • P8813 [CSP-J 2022] 乘方
    题目描述小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数\(a\)和\(b\),求\(a^b\)的值是多少。\(a^b\)即\(b\)个\(a\)相乘的值,例如\(2^3\)即为\(3\)个\(2\)相乘,结果为\(2\times2\times2=8\)。“简单!”小文心想,同时很快就写出了一份程序,......
  • 2023-2024-1 20231302《计算机基础与程序设计》第二周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标<数字化,信息安全,自学教材《计算机科学概论》第1章并完成云班课测试、自学教材《C语......
  • 2023-2024-1 20231413 《计算机基础与程序设计》第二周学习总结
    班级:2023-2024-1-计算机基础与程序设计作业要求:2023-2024-1《计算机基础与程序设计》教学进程目标:自学教材:计算机科学概论第1章并完成云班课测试《C语言程序设计》第1章并完成云班课测试教材学习内容总结:再次阅读了《计算机科学概论》第1章,更加了解了计算机与计算系统;对C语......
  • 2023-2024-1 20231314《计算机基础与程序设计》第2周学习总结
    2023-2024-120231314《计算机基础与程序设计》第2周学习总结作业信息这个作业属于哪个课程<班级的链接>((https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP))这个作业要求在哪里(2022-2023-1计算机基础与程序设计第二周作业)这个作业的目标《计算机科学概论......
  • LeetCode 13 罗马数字转整数
    LeetCode13罗马数字转整数1.题目地址https://leetcode.cn/problems/roman-to-integer/description/2.题解这道题的解题过程非常简单,具体如下:1.我们需要将罗马数字对应的数,存到一个哈希表中。待用到时,直接使用即可。2.对于正常情况讲(前面......
  • 2023-2024-1 20231312 《计算机基础与程序设计》第二周学习总结
    作业信息|这个作业属于哪个课程|<班级的链接>2023-2024-1-计算机基础与程序设计||这个作业要求在哪里|<作业要求链接>2023-2024-1计算机基础与程序设计第二周作业||这个作业的目标|<计算机科学概论第1章并完成云班课测试《C语言程序......
  • 20231306 gcc测试
    通过homebrew安装gcc2.检测gcc安装成功3.创建文件夹“my_program.c"并编写代码4.创建文件“my_program"并用gcc进行预处理......
  • 洛谷 P1969 [NOIP2013 提高组] 积木大赛 - 小思维
    洛谷P1969[NOIP2013提高组]积木大赛[NOIP2013提高组]积木大赛题目描述春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为\(n\)的大厦,大厦可以看成由\(n\)块宽度为\(1\)的积木组成,第\(i\)块积木的最终高度需要是\(h_i\)。在搭建开始之前......
  • 通过机器人发送消息到钉钉群
    查看文档:https://open.dingtalk.com/document/robots/custom-robot-access1、在钉钉群中创建一个机器人,获取机器人的Webhook地址。可以参考钉钉官方文档来创建机器人并获取Webhook地址。   2、使用Go语言的HTTP请求库发送消息到Webhook地址。可以使用标准库的......