1041.困于环中的机器人 874.模拟行走的机器人 模拟行走的机器人 2 (三道机器人的模拟题)

共性

  1. 对于直接行走类的题,我们都可以用 int[][] dirs = new int[][]{{0,1}, {-1,0}, {0,-1}, {1,0}}; 来表示向 北 西 南 东 走一步
  2. 可以 int x = 0, y = 0, d = 0 xy 表示坐标,d表示方向,要和上面表示的方向对应
  3. 由于是对应的 d = 0 表示北 d = 1 表示西 d = 2 表示南 d = 3 表示东 即逆时针一圈
  4. 左转: d = (d+1) % 4 右转:d = ((d - 1) % 4 + 4) % 4 => d = (d + 3) % 4

1041.困于环中的机器人

经过多次指令 instructions 后,判断机器人是不是能回到原点。

解析:

  • 执行一次指令后能否回到原点 (0, 0) 不看方向
  • 执行一次指令后,方向是不是不朝北
class Solution {public boolean isRobotBounded(String instructions) {int x = 0, y = 0, d = 0; // d用来控制方向,d为0表示向北int[][] dirs = new int[][]{{0,1}, {-1,0}, {0,-1}, {1,0}};for(char c : instructions.toCharArray()){if(c == 'G'){x += dirs[d][0];y += dirs[d][1];}else if(c == 'L'){d = (d + 1) % 4; // 每次左转,d就能加1}else if(c == 'R'){d = ((d - 1) % 4 + 4) % 4; // 每次右转,d-1,但是为了让d在 0 - 4里面,就需要+4// d = (d + 3) % 4;}}return (x==0&&y==0) || d != 0;}
}

874.模拟行走的机器人

经过多次指令 commands 后,机器人离原点的最大欧式距离的平方,注意存在障碍物 obstacles ,有障碍物不能越过,只能停在前一个位置,但不影响后续指令

解析:

  • 利用字符串拼接的模式存储障碍物,以方便比较
  • 一次一步的走,有障碍物就停住
class Solution {public int robotSim(int[] commands, int[][] obstacles) {// 存障碍物,直接将 x y 存为String形式Set<String> set = new HashSet<>();for(int[] o : obstacles) set.add(o[0] + "," + o[1]);// 方向 南 北 西 东 ==> 要与d对应 0表示向北走一步 1西走 2南走 3东走int[][] dirs = new int[][]{{0, 1}, {-1, 0}, {0, -1}, {1, 0}};int ans = 0; // x代表东西走,y代表南北走  d代表方向 0北 1西 2南 3东int x = 0, y = 0, d = 0; for(int i = 0; i < commands.length; i++){if(commands[i] == -2){// 左转 顺时针转,方向都会 + 1// d = d == 3 ? 0 : d + 1;d = (d + 1) % 4; // 左转相当于方向+1}else if(commands[i] == -1){// 右转 逆时针转,方向都会 - 1// d = d == 0 ? 3 : d - 1;d = (d + 3) % 4; // 右转相当于左转3次}else{// 没有遇到障碍物会一直走,直到这一轮的步数走完// 有障碍物就不会再走一步while(commands[i] > 0 && !set.contains((x + dirs[d][0]) + "," + (y + dirs[d][1]))){x += dirs[d][0];y += dirs[d][1];commands[i]--;}ans = Math.max(ans, x*x + y*y);}}return ans;}
}

模拟行走的机器人 2

在一个网格内行走,走到了边界就逆时针旋转90°,然后继续向前走,设置行走的方法函数。

解析:

  • 该题不用真的行走,只需要知道机器人的位置在哪里就行了
  • 需要单独判断一下 (0, 0) 的朝向问题,因为可能刚好走回来到这个点,就超南,如果没有移动过就超东
class Robot {// 前进的四个方向String[] ss = new String[]{"East", "North", "West", "South"};int w, h, loc; // loc :有效(取模后)移动步数boolean moved; // 记录是否经过移动,用于判断 (0, 0) 的方向public Robot(int width, int height) {w = width;h = height;}public void step(int num) {moved = true;loc += num; // 只用知道总步数就行了,因为他一直在转圈圈loc = loc % (2 * (w - 1) + 2 * (h - 1)); // 路程超过了一圈,直接取模,看位置在哪里就行了,不用真的走}public int[] getPos() {int[] info = move();return new int[]{info[0], info[1]};}public String getDir() {int[] info = move();// x y 代表方向, dir 代表朝向int x = info[0], y = info[1], dir = info[2];// (0, 0) 时, 当未移动过方向为 East, 移动过方向为 South (从上指过来)if(x == 0 && y == 0) return moved ? ss[3] : ss[0];return ss[dir];}int[] move(){if(loc <= w - 1){// 当移动的步数在[0, w - 1] 时,所在位置在外圈下方,方向为Eastreturn new int[]{loc, 0, 0};}else if(loc <= (w - 1) + (h - 1)){// 往右走到底,然后往上走,方向为:Northreturn new int[]{w-1, loc - (w - 1), 1};}else if(loc <= 2 * (w - 1) + (h - 1)){// 往右走到底,然后往上走到底,又往左走,方向:Westreturn new int[]{(w - 1) - (loc - ((w - 1) + (h - 1))), h - 1, 2};}else {// 最后一种情况是在左边做外圈,往下走return new int[]{0, (h - 1) - (loc - (2 * (w - 1) + (h - 1))), 3};}}  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现 Rollup 插件alias 并使用vitest提高开发效率

本篇文章是对 实现 Rollup 插件 alias | 使用 TypeScript 实现库的基本流程 | 使用单元测试提高开发效率 的总结。其中涉及到开发一个组件库的诸多知识点。 实现一个经常用的 rollup 插件 alias 首先执行npm init命令初始化一个package.json文件&#xff0c;因为插件使用了ty…

微服务: 05-rabbitmq设置重试次数并设置死信队列

目录 1. 上文传送门: 2. 前言简介: 2.1 问: 消费端重复循环异常如何解决? 2.2 为什么要使用死信队列 2.3 案例思路 -> ps: 以下案例经过测试(思路一/二实现原理一样) -> 2.3.1 思路一 -> 2.3.2 思路二 3. 案例代码 3.1 简单介绍案例 3.2 声明交换机 队…

分布式锁,学习笔记

什么是分布式锁 1.1 作用&#xff1a; 保证数据的正确性&#xff1a; 比如&#xff1a;秒杀的时候防止商品超卖&#xff0c;接口幂等性。 避免重复处理数据&#xff1a; 比如&#xff1a;1避免调度任务在多台机器重复执行&#xff0c;2避免缓存过期所有请求都去加载数据库。 一…

Redis实战案例19-Redis解决主从一致性问题

主节点&#xff08;Master&#xff09;“写操作”&#xff1a; 接收并响应客户端的读写请求。持久化数据到磁盘&#xff08;根据配置可以选择使用RDB快照或者AOF日志&#xff09;。将自己的写操作同步给所有的从节点。处理发布/订阅&#xff08;Pub/Sub&#xff09;模式中的发…

【剑指offer】11. 机器人的运动范围(java)

文章目录 机器人的运动范围描述示例1示例2示例3示例4思路完整代码 机器人的运动范围 描述 地上有一个 rows 行和 cols 列的方格。坐标从 [0,0] 到 [rows-1,cols-1] 。一个机器人从坐标 [0,0] 的格子开始移动&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#xff…

ARM 架构是什么?

ARM&#xff08;Advanced RISC Machines&#xff09;架构是一种处理器架构&#xff0c;它是一种精简指令集计算机&#xff08;RISC&#xff09;架构。ARM架构最初由ARM Holdings&#xff08;现在是SoftBank Group的子公司&#xff09;开发&#xff0c;并在1980年代末和1990年代…

【PAT】1028.List Sorting

【PAT】1028.List Sorting Excel can sort records according to any column. Now you are supposed to imitate this function. Input Specification: Each input file contains one test case. For each case, the first line contains two integers N (≤105) and C, wher…

mysql的完全包含关系怎么写

问&#xff1a; mysql从a表查到aid有两值1&#xff0c;2&#xff0c;b表中存在a表的主键作为外键&#xff0c;从b表中查找完全包含aid的的值&#xff08;1&#xff0c;2&#xff09;的bid 答 如果你有一个表a包含主键列a_id&#xff0c;并且有一个表b&#xff0c;它具有一个…

数据结构和算法:深度优先搜索 (DFS) 和广度优先搜索 (BFS) 相关题目

文章目录 1. 岛屿问题&#xff08;岛屿连通&#xff09;1.1 岛屿数量1.1.1 DFS 解法1.1.2 BFS 解法 深度优先搜索 (DFS) 和广度优先搜索 (BFS)是比较难的算法问题&#xff0c;但也是面试常考题&#xff0c;因此需要认真研究并掌握。 DFS 用递归实现&#xff0c;BFS用栈实现 1. …

使用 SageMaker 对 Whisper 模型进行微调及部署

使用 SageMaker 对 Whisper 模型进行微调及部署 Whisper 作为 OpenAI 最新开源的自动语音识别&#xff08;ASR&#xff09;模型&#xff0c;采用了编码器-解码器&#xff08;encoder- decoder&#xff09;transformer架构&#xff0c;并使用了 68 万小时的从互联网收集的多语言…

PersistentVolume:怎么解决数据持久化

Kubernetes 的 Volume 对数据存储已经给出了一个很好的抽象&#xff0c;它只是定义了有这么一个“存储卷”&#xff0c;而这个“存储卷”是什么类型、有多大容量、怎么存储&#xff0c;我们都可以自由发挥。Pod 不需要关心那些专业、复杂的细节&#xff0c;只要设置好 volumeMo…

安卓APK反编译+修改+重打包+签名

目录 1.下载反编译工具包。2.将APK包&#xff0c;重命名为ZIP&#xff0c;解压。放到反编译根目录下。3.使用apktool反编译修改smail文件&#xff0c;进行重打包4.重新打包5.重签名 1.下载反编译工具包。 反编译工具包地址&#xff1a;百度网盘 提取码&#xff1a;dsu3 解压后…

AtcoderABC243场

A - Shampoo A - Shampoo ] 题目大意 高桥家有三个人&#xff1a;高桥、他的父亲和他的母亲。每个人每晚都在浴室洗头发。他们按照顺序使用AA、BB和CC毫升的洗发水。 问&#xff0c;今天早上瓶子里有VV毫升的洗发水。在不重新装满的情况下&#xff0c;谁会第一个用完洗发水洗头…

网工内推 | 美图秀秀招网工,大专以上,15薪,NP认证优先

01 美图公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、美图大厦网络、分公司网络、IT相关项目的网络、办公内网服务器&#xff1b; 2、负责网络的设计、运行、管理和维护等工作&#xff1b; 3、负责远程办公环境的优化、运行、管理和维护工作&#xff1b; 4、…

python匿名函数Lambda

1、Lambda 函数简介 Lambda函数也被称为匿名(没有名称)函数&#xff0c;它直接接受参数的数量以及使用该参数执行的条件或操作&#xff0c;该参数以冒号分隔&#xff0c;并返回最终结果。为了在大型代码库上编写代码时执行一项小任务&#xff0c;或者在函数中执行一项小任务&a…

git merge详细用法

git merge用法 一、开发分支&#xff08;dev&#xff09;上的代码达到上线的标准后&#xff0c;要合并到 master 分支 git checkout dev git pull git checkout master git merge dev git push -u origin master二、当master代码改动了&#xff0c;需要更新开发分支&#xff…

吴恩达机器学习2022-Jupyter-用scikitlearn实现线性回归

1可选实验:使用Scikit-Learn进行线性回归 有一个开源的、商业上可用的机器学习工具包&#xff0c;叫做 scikit-learn。本工具包包含您将在本课程中使用的许多算法的实现。 1.1工具 您将利用 scikit-learn 以及 matplotlib 和 NumPy 中的函数。 2线性回归封闭式解决方案 Sc…

nvm常用命令

查看node.js的所有版本&#xff1a; npm view node versions 查看 nvm 是否安装成功&#xff1a; command -v nvm查看当前使用的 Node 版本&#xff1a; node -v将安装 12.7.0 版本的Node&#xff1a; nvm install 12.7.0卸载 12.7.0 版本的Node&#xff1a; nvm uninstall 12…

为什么低代码只能掀起小浪花?了解低代码的得失与前景

导语&#xff1a;低代码是相对于高代码和无代码的一个中间概念&#xff0c;通常强调的是用户不需要学习如何写代码&#xff0c;就能完成工作。然而低代码模式一直不温不火&#xff0c;原因是什么呢&#xff1f;一起来看一下吧。 最近互联网大公司裁员消息又起&#xff0c;“低代…

Linux 配置常见服务器命令

Linux常见配置服务器的命令整理&#xff0c;基于Centos 7 。 基本操作命令 查看ens33 ip ifconfig ens33 查看系统版本 cat /etc/redhat-release 查找文件install.log、httpd.conf、hosts、smb.conf、network find -name te.txt 使用“cp 源文件 目标文件”命令进行复制 cp t…