当前位置: 首页 > news >正文

剑指Offer13.机器人的运动范围 C++

1、题目描述

  • 地上有一个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。请问该机器人能够到达多少个格子?
  • 示例 1
    输入:m = 2, n = 3, k = 1
    输出:3
  • 示例 2
    输入:m = 3, n = 1, k = 0
    输出:1

2、VS2019上运行

使用方法一:广度优先搜索BFS

#include <iostream>
#include <vector>
#include <queue>
using namespace std;class Solution {// 计算 x 的数位之和int get(int x) {int res = 0;for (; x; x /= 10) {res += x % 10;}return res;}
public:int movingCount(int m, int n, int k) {if (!k) return 1;queue<pair<int, int> > Q;//队列Q用于存储待访问的格子数量,第一个表示横坐标,第二个表示纵坐标// 向右和向下的方向数组//以向右(x轴正方向)和向下(y轴正方向)移动为例。int dx[2] = { 0, 1 };int dy[2] = { 1, 0 };//创建一个二维矩阵 vis,用于记录矩阵中每个位置是否已经被访问过。//初始时,所有位置都被标记为未访问(0)。vector<vector<int> > vis(m, vector<int>(n, 0));//m行n列,全部元素设为0//向队列 Q 中插入一个整数对作为元素。这里是将 (0, 0) 作为起始位置插入到队列中Q.push(make_pair(0, 0));vis[0][0] = 1;//将矩阵 vis 中坐标 (0, 0) 的元素设置为 1,表示该位置已被访问。int ans = 1;//变量 ans 用于记录满足特定条件的位置数量while (!Q.empty()) {// 取出队首的格子位置pair<int, int> front = Q.front();Q.pop();//将整数对 front 中的第一个元素和第二个元素分别存储到变量 x 和 y 中。也就是横坐标和纵坐标int x = front.first;int y = front.second;for (int i = 0; i < 2; ++i) {//循环遍历一个长度为2的数组,右和下int tx = dx[i] + x;//计算出下一个横坐标int ty = dy[i] + y;//计算下一个纵坐标// 判断下一个位置是否满足限制条件if (tx < 0 || tx >= m || ty < 0 || ty >= n || vis[tx][ty] || get(tx) + get(ty) > k) continue;Q.push(make_pair(tx, ty));//将计算出的下一个位置 (tx, ty) 插入到队列 Q 中,作为待访问的位置。vis[tx][ty] = 1;//该位置已访问ans++;}}return ans;}
};
int main() {int m = 2, n = 3, k = 1;Solution sol;int result = sol.movingCount(m, n, k);cout << result << endl;return 0;
}

3

3、解题思路

  • 这段代码是解决一个问题:给定一个 m × n 的矩阵,矩阵中的每个位置代表一个格子。现在有一个机器人位于矩阵的左上角,机器人可以向右或向下移动,但不能移动到数位之和大于 k 的格子。请问,机器人能够到达多少个格子?
    具体的解决思路如下:
  • 1.定义一个函数 get(int x),用来计算数位之和。该函数通过循环将数字 x 每一位上的数字相加,返回数位之和。
  • 2.在 movingCount 函数中,首先判断特殊情况,如果 k 为 0,表示没有限制,机器人可以到达任意位置,所以直接返回 1。
  • 3.创建一个队列 Q,用于存储待访问的格子位置。队列中的每个元素都是一个整数对,表示格子的横坐标和纵坐标。
  • 4.创建两个方向数组 dx 和 dy,用来表示向右和向下移动的偏移量。
  • 5.创建一个二维矩阵 vis,用于记录矩阵中的每个位置是否已经被访问过。初始时,所有位置都被标记为未访问(0)。
  • 6.将起始位置 (0, 0) 插入到队列 Q 中,并将矩阵 vis 中对应的位置设为已访问(1)。
  • 7.定义变量 ans,初始值为 1,用于记录满足限制条件的位置数量。
  • 8.使用广度优先搜索算法,不断遍历队列 Q 中的格子位置,进行下一步移动的判断。
  • 9.在遍历的过程中,取出队列头部的格子位置,并将其分别存储到变量 x 和 y 中。
  • 10.循环遍历方向数组 dx 和 dy 中的元素,分别计算出下一个位置的横坐标 tx 和纵坐标 ty。
  • 11.判断下一个位置是否越界、已经访问过、或数位之和大于 k。如果满足其中任一条件,跳过当前循环,进行下一次循环。
  • 12.如果下一个位置满足限制条件,将其插入队列 Q 中作为待访问的位置,并将矩阵 vis 中对应的位置设为已访问(1)。
  • 13.将计数器 ans 递增,表示发现了一个满足条件的位置。
  • 14.当队列 Q 中的格子位置全部遍历完毕时,返回 ans,即满足条件的位置数量。
  • 整体思路是通过广度优先搜索算法遍历满足条件的位置,并使用一个队列和一个二维矩阵分别记录待访问的位置和已访问的位置。算法的时间复杂度为 O(m * n),其中 m 和 n 分别表示矩阵的行数和列数。

4、get函数

  // 计算 x 的数位之和int get(int x) {int res = 0;for (; x; x /= 10) {res += x % 10;}return res;}
  • 这段代码定义了一个名为 get 的函数,它的作用是计算一个整数 x 的数位之和。
  • 首先,变量 res 被初始化为 0,用于保存数位之和的结果。
  • 然后,通过一个 for 循环,循环的条件是 x 不为0,循环体内执行 x = x / 10,即将 x 除以 10,这样可以实现依次取 x 的个位、十位、百位等。
  • 在每次循环中,通过 x % 10 取出 x 的个位数,然后将它加到 res 变量上。
  • 最后,当循环结束时,函数返回 res,即计算得到的数位之和。
  • 例如,如果 x 的值为 12345,那么这个函数将返回的数位之和为 1 + 2 + 3 + 4 + 5 = 15。

5、queue<pair<int, int> > Q

  • 这行代码声明了一个名为 Q 的队列变量,用于存储格子的位置信息。
  • Q 是一个队列,每个队列元素都是一个二维坐标的整数对,表示矩阵中的某个格子的位置。
  • pair<int, int> 表示一个这样的二维坐标对,其中第一个整数表示横坐标,第二个整数表示纵坐标。
  • 这样定义的队列 Q 可以用来保存待访问的格子位置,通常在广度优先搜索算法中会使用队列来实现。通过队列的先进先出特性,可以实现按照一定顺序逐步处理格子位置,从而完成搜索或遍历操作。

6、 vector<vector > vis(m, vector(n, 0));

  • 这行代码声明了一个二维矩阵变量 vis,用于记录矩阵中每个位置的访问状态。
  • vis 是一个二维的 vector,其中第一维表示矩阵的行数 m,第二维表示矩阵的列数 n。这样定义的二维矩阵 vis 有 m 行、n 列。
  • vector<int>(n, 0) ,为每一行创建一个内部向量,创建一个包含 n 个元素的整数型向量,并将每个元素的初始值设置为0。这样创建的向量将被用作矩阵 vis 的每一行,用于表示对应位置的访问状态。
  • 在 vector<int>(n, 0) 中,vector<int> 表示创建一个整数型向量,(n, 0) 是一个构造函数的参数,指定了向量的大小为 n,且将每个元素初始化为0。最终得到的向量将作为矩阵 vis 的一行。
  • 在该算法中,vis 矩阵用于记录矩阵中每个位置的访问状态。当一个位置被访问时,对应位置的值会被设置为1,表示已经访问过。这在广度优先搜索等算法中很常见,可以避免重复访问同一个位置。

7、for (int i = 0; i < 2; ++i) {};

  • 循环遍历一个长度为2的数组是为了考虑当前位置 (x, y) 的相邻位置。
  • 在给定的代码中,循环遍历的是长度为2的数组 [0, 1]。这是因为在二维矩阵中,我们通常只需要考虑横向和纵向的相邻位置,即上方、下方、左侧和右侧位置。这个数组的两个元素 [0, 1] 分别表示在横向和纵向上的移动方式。

相关文章:

剑指Offer13.机器人的运动范围 C++

1、题目描述 地上有一个m行n列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动&#xff0c;它每次可以向左、右、上、下移动一格&#xff08;不能移动到方格外&#xff09;&#xff0c;也不能进入行坐标和列坐标的数位之和大于k的…...

List、Map、Set打印

List List&#xff1a;和数组类似&#xff0c;List可以动态增长&#xff0c;查找元素效率高&#xff0c;插入删除元素效率低&#xff0c;因为会引起其他元素位置改变。 普通[1,2] 1.循环 2.System.out.println(list); int数组[1,2,3,4,5,6,1,2,3] 1.for (int[] array : list)…...

软件机器人在渔业船员证书核发中自动化二次审批制证,提高效率和准确性

近年来&#xff0c;随着科技的不断进步&#xff0c;自动化软件机器人在各个领域得到了广泛应用。在渔业船员证书核发事项中&#xff0c;传统的审批和制证流程相对繁琐。博为小帮软件机器人可以让这一流程变得更加高效和准确。 在过去&#xff0c;渔业船员证书核发事项需要在省级…...

Godot4 C# vscode开发环境搭建

用vscode搭建Godot4 C# 开发环境搭建 软件Godot配置vscode配置结果参考 软件 Godot .Net版本: 下载链接vscode :自行下载.netcore7&#xff1a;.netcore6可能也行vscode插件&#xff1a; Godot配置 1.配置文件用VSCode打开 2.生成C#项目 项目–>工具–>C#->Creat…...

nginx简介与安装配置,目录结构和配置文件介绍

一.nginx简介 1.简介 2.特性 二.nginx安装 1.rpm包方式 &#xff08;1&#xff09;下载扩展源 &#xff08;2&#xff09;安装扩展rpm包&#xff0c;nginx -V查看配置参数&#xff0c;后面源码安装时要用到 2.源码方式 &#xff08;1&#xff09;建议提前下好所需要的部…...

CTF流量题解http4.pcapng

流量分析 导出http 打开报错 验证文件头&#xff0c;发现是zip。 图常片见里文可件能的包16含进:压制缩头包部,word,pdf JPG FF D8 FF E0/FF D8 FF E1 PNG 89 50 4E 47 GIF 47 49 46 38 ZIP 50 4B 03 04 RAR 52 61 72 21 MP3 49 44 33 0 改后缀 使用工具爆破。 git clone git…...

旷视科技AIoT软硬一体化走向深处,生态和大模型成为“两翼”?

齐奏AI交响曲的当下&#xff0c;赛道玩家各自精彩。其中&#xff0c;被称作AI四小龙的商汤科技、云从科技、依图科技、旷视科技已成长为业内标杆&#xff0c;并积极追赶新浪潮。无论是涌向二级市场还是布局最新风口大模型&#xff0c;AI四小龙谁都不甘其后。 以深耕AIoT软硬一…...

STM32 F103C8T6学习笔记2:GPIO的认识—GPIO的基本输入输出—点亮一个LED

今日继续学习使用 STM32 F103C8T6开发板 点亮一个LED灯&#xff0c;文章提供源码&#xff0c;测试工程&#xff0c;实验效果图&#xff0c;希望我的归纳总结会对大家有帮助~ 目录 GPIO的认识与分类 &#xff1a; 引脚安排整理&#xff1a; 定时器的引脚例举&#xff1a; …...

数组相关练习

数组练习 将数组转化成字符串数组拷贝求数组元素的平均值查找数组中指定元素(顺序查找)二分查找冒泡排序数组逆序 将数组转化成字符串 import java.util.Arrays;public class Text1 {public static void main(String[] args) {int[] arr {5, 6, 4, 2};System.out.println(Arr…...

Leetcode-每日一题【剑指 Offer 11. 旋转数组的最小数字】

题目 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers &#xff0c;它原来是一个升序排列的数组&#xff0c;并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如&#xff0c;数组 [3,4…...

git教程(第一次使用)

一、gitee和github区别 二、git使用 下载地址 windows&#xff1a;https://gitforwindows.org/ mac&#xff1a;http://sourceforge.net/projects/git-osx-installer/ 1.git初次运行前的配置 &#xff08;1&#xff09;配置用户信息 git config --global user.name "…...

Autoware.ai1.14.0自动驾驶-Demo运行

Autoware.ai1.14.0自动驾驶-Demo运行 数据准备 下载数据&#xff1a; wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_data.tar.gz wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_150324.tar.gz一定要注意解压文件是在.auto…...

AttributeConverter

AttributeConverter 是 JPA 中的一个接口&#xff0c;&#xff0c;用于实体属性和 数据库字段&#xff0c;&#xff0c;之间的转换&#xff0c;&#xff0c;&#xff0c;类似mybatis中的typeHandler AttributeConverter使用 定义一个类实现AttributeConverter接口&#xff0c…...

【逗老师的PMP学习笔记】8、项目质量管理

目录 一、规划质量管理1、质量管理的发展历史2、戴明环&#xff0c;PDCA理论3、【关键输入】事业环境因素4、【关键输入】成本效益分析5、【关键工具】质量成本6、【关键输出】质量管理计划7、插一嘴&#xff0c;项目的三个标准8、【关键工具】质量测量指标 二、管理质量1、【关…...

Zookeeper集群

目录 一、Zookeeper 概述 1&#xff09;Zookeeper 定义 2&#xff09;Zookeeper 工作机制 3&#xff09;Zookeeper 特点 4&#xff09;Zookeeper 数据结构 5&#xff09;Zookeeper 应用场景 6&#xff09;Zookeeper 选举机制 ●第一次启动选举机制 ●非第一次启动选举机…...

后端进阶之路——Spring Security构建强大的身份验证和授权系统(四)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…...

【香瓜说职场】第10月(2018.01.29)

自从17年4月份开始辞职创业&#xff0c;已经10个月了。聊聊近况。 一、博客被冻结 冻结原因是我把博客的积分放在淘宝店铺售卖&#xff0c;卖一周就被查了。 我的每个积分售卖0.5元&#xff0c;是全网最低&#xff0c;每个资源下载一般需要2、3个积分。售…...

​LeetCode解法汇总1749. 任意子数组和的绝对值的最大值

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你一个整数数组 nums 。一个子数组 [numsl, numsl1, ..., numsr-1, numsr] 的…...

4.2、Flink任务怎样读取文件中的数据

目录 1、前言 2、readTextFile&#xff08;已过时&#xff0c;不推荐使用&#xff09; 3、readFile&#xff08;已过时&#xff0c;不推荐使用&#xff09; 4、fromSource(FileSource) 推荐使用 1、前言 思考: 读取文件时可以设置哪些规则呢&#xff1f; 1. 文件的格式(tx…...

Effective Java笔记(28)列表优于数组

数组与泛型相比&#xff0c;有两个重要的不同点 。 首先&#xff0c;数组是协变的&#xff08; covariant &#xff09; 。 这个词听起来有点吓人&#xff0c;其实只是表示如果 Sub 为 Super 的子类型&#xff0c;那么数组类型 Sub[ ]就是Super[ ]的子类型。 相反&#xff0c;泛…...

北京UPS不间断电源经销商推荐名录

一、推荐公司概览中伟博信&#xff08;北京&#xff09;电子科技有限公司山特电子&#xff08;深圳&#xff09;有限公司北京办事处施耐德电气&#xff08;中国&#xff09;有限公司北京分公司科华数据股份有限公司北京分公司深圳科士达科技股份有限公司北京子公司二、北京地区…...

C语言编程实战:ASCII码表的深度解析与应用

1. ASCII码表&#xff1a;程序员的字符密码本 第一次接触ASCII码表时&#xff0c;我盯着那张密密麻麻的数字字符对照表发呆了半小时。直到在调试程序时发现字母A居然能用数字65代替&#xff0c;才突然意识到&#xff1a;这简直就是程序员世界的摩斯密码。ASCII&#xff08;Amer…...

避坑指南:OpenMV形状识别参数调不好?从霍夫圆检测到find_rects的实战经验分享

OpenMV形状识别实战&#xff1a;从参数调优到多场景适配的深度解析 当你在实验室里用OpenMV官方例程完美识别出圆形贴片时&#xff0c;是否曾信心满满地将设备搬到车间现场&#xff0c;却发现识别率断崖式下跌&#xff1f;这种"实验室王者&#xff0c;现场青铜"的困…...

告别纯HDL!用Xilinx SDK和MicroBlaze MCS,像写软件一样玩转FPGA嵌入式开发

从软件工程师视角玩转FPGA&#xff1a;基于MicroBlaze MCS的嵌入式开发实战 在传统认知中&#xff0c;FPGA开发往往与硬件描述语言&#xff08;HDL&#xff09;紧密绑定&#xff0c;这让许多习惯高级语言编程的软件工程师望而却步。但现代FPGA开发环境已经发生了革命性变化——…...

5分钟掌握Pearcleaner:macOS深度清理的终极免费方案

5分钟掌握Pearcleaner&#xff1a;macOS深度清理的终极免费方案 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 您是否曾为macOS上卸载应用后残留的配置文件…...

如何一键清理Windows冗余驱动:Driver Store Explorer完全指南

如何一键清理Windows冗余驱动&#xff1a;Driver Store Explorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否发现C盘空间不知不觉就满了&#xff1f;Windows系统在C:…...

Jenkins 安装Publish over SSH插件远程发布执行shell脚本

1.在jenkins安装Publish over SSH插件&#xff0c;在Manage Jenkins–Plugins–Available plugins中搜索Publish over SSH&#xff0c;然后安装即可。2.安装成功以后&#xff0c;需要到系统设置DashBoard—Manage Jenkins—System中进行配置&#xff0c;如图 可以通过密码链接也…...

ARM PMU性能监控机制与微架构事件解析

1. ARM PMU性能监控体系深度解析性能监控单元(PMU)是现代处理器中用于统计硬件事件的关键模块&#xff0c;它如同处理器的"听诊器"&#xff0c;能够精确捕捉微架构层面的各类行为。在ARMv8/v9架构中&#xff0c;PMU通过事件计数器机制实现对指令流水线、缓存子系统、…...

照片直播如何实现?Android 通过 PTP/MTP 有线连接相机的技术方案

一、应用场景 在婚礼摄影、赛事记录、电商拍摄等业务中&#xff0c;客户往往希望&#xff1a; 摄影师按下快门&#xff0c;手机或平板立刻能看到照片。 常见传输方式的对比&#xff1a; 方式 问题 WiFi 延迟高、断连频繁 蓝牙 传输速度慢 有线 OTG ✅ 稳定、实时、低…...

EPM900编程器HEX文件烧录指南与技巧

1. EPM900编程器与HEX文件烧录概述 EPM900是Keil公司推出的一款LPC系列微控制器仿真编程器&#xff0c;主要用于NXP LPC系列ARM芯片的调试与程序烧录。在实际工程开发中&#xff0c;我们经常需要将编译生成的HEX文件直接烧录到目标芯片中&#xff0c;而EPM900恰好支持这一功能。…...