洛谷 U123017 机器人题解

这篇具有很好参考价值的文章主要介绍了洛谷 U123017 机器人题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.题目描述

机器人会按照输入的指令进行移动,命令包括’E’,‘S’,‘W’,'N’四种,分别对应东南西北。执行某个命令时它会消耗1秒钟向对应的方向移动一格单位。

在0时刻机器人位于(0,0)。
如果遇到’E’命令,向右一个单位,即到达(1,0)。如果遇到’S’命令,向下一个单位,即到达(0,-1)。如果遇到’W’命令,向左一个单位,即到达(-1,0)。如果遇到’N’命令,向上一个单位,即到达(0,1)。

作为新型机器人,它可以执行指令串,从指令串的第一个指令开始执行,如果执行完了最后一个指令,又回到头执行第一个执行,也就是从头开始循环。

求t秒后机器人所在位置坐标。

输入格式

第一行一个字符串,表示指令串

第二行为时间t

输出格式

输出t秒后机器人的坐标位置

样例 #1

样例输入 #1
NSWWNSNEEWN
12
样例输出 #1
-1 3

提示

对于60%的数据, 1 ≤ 1\le 1 t ≤ t\le t 2 × 1 0 5 2\times10^5 2×105,且命令长度 ≤ 5000 \le5000 5000

对于100%的数据, 1 ≤ 1\le 1 t ≤ t\le t 2 × 1 0 9 2\times10^9 2×109,且命令长度 ≤ 5000 \le5000 5000


2.读入指令

根据题目可得:机器人初始位置位于(0,0)。读入一串字符串作为指令。在读入 N 时,向上一个单位;在读入 S 时,向下一个单位;在读入 W 时,向左一个单位;在读入 E 时,向右一个单位。

即当初始位置位于(0,0)时,机器人得到不同指令后移动方式如表格所示:

指令 横坐标( x x x) 纵坐标( y y y)
N 不变 +1
S 不变 -1
W -1 不变
E +1 不变

根据上述内容,可以写出如下的for循环:

string str; // 定义字符串 str 用于存储指令序列
int t; // 定义整型变量 t 用于存储时间
for (int i=1;i<=t;i++){
           // 根据当前指令更新机器人的位置
           if(str[i-1]=='E'){
               x++; // 向东移动
           }
           else if(str[i-1]=='S'){
               y--; // 向南移动
           }
           else if(str[i-1]=='W'){
               x--; // 向西移动
           }
           else{
               y++; // 向北移动
           }
       }

这时候,你就完成了此题的基础部分。

3.判断指令长度

题中明确给出了这样的内容:

从指令串的第一个指令开始执行,如果执行完了最后一个指令,又回到头执行第一个执行,也就是从头开始循环

因此,我们需要分两类进行讨论:

  • 指令数量大于等于时间
  • 指令数量小于时间

· 指令数量大于等于时间

直接使用刚才的for循环即可。

if (str.size()>t){
       // 循环执行指令序列,直到时间t
       for (int i=1;i<=n;i++){
           // 根据当前指令更新机器人的位置
           if(str[i-1]=='E'){
               x++; // 向东移动
           }
           else if(str[i-1]=='S'){
               y--; // 向南移动
           }
           else if(str[i-1]=='W'){
               x--; // 向西移动
           }
           else{
               y++; // 向北移动
           }
       }
       // 输出机器人在时间t后的位置
       cout<<x<<' '<<y;
   }

· 指令数量小于时间

此时,先执行完整个字符串。计算循环执行的次数和剩余时间后,累加循环执行后的位置,再得到结果。

// 如果指令序列的长度不大于时间t,先执行完整个序列
       for(int i=1;i<=str.size();i++){
           if(str[i-1]=='E'){
               x++;
           }
           else if(str[i-1]=='S'){
               y--;
           }
           else if(str[i-1]=='W'){
               x--;
           }
           else{
               y++;
           }
       }
       // 计算循环执行的次数和剩余时间
       int rest=n % s.size(); // 剩余时间
       t /= s.size(); // 循环执行的次数
       int newx,newy; // 用于存储循环后的位置
       // 累加循环执行后的位置
       for(int i=1;i<=n;i++){
           newx+=x;
           newy+=y;
       }
       // 根据剩余时间更新位置
       for(int i=1;i<=rest;i++){
           if (str[i-1]=='E'){
               newx++;
           }
           else if(s[i-1]=='S'){
               newy--;
           }
           else if(s[i-1]=='W'){
               newx--;
           }
           else{
               newy++;
           }
       }
       // 输出最终位置
       cout<<newx<<' '<<newy;
   }

4.最终代码

代码含语法错误请勿照抄 \textcolor{#e9e9e9}{代码含语法错误请勿照抄} 代码含语法错误请勿照抄

#include<bits/stdc++.h>
using namespace std;
string str; // 定义字符串str用于存储指令序列
int t; // 定义整型变量t用于存储时间
int x,y; // 定义整型变量x和y用于存储机器人的坐标

// 主函数
int main(){
   // 读取指令序列和时间t
   cin>>str>>t;
   // 如果指令序列的长度大于时间t
   if (str.size()>t){
       // 循环执行指令序列,直到时间t
       for (int i=1;i<=t;i++){
           // 根据当前指令更新机器人的位置
           if(str[i-1]=='E'){
               x++; // 向东移动
           } else if(str[i-1]=='S'){
               y--; // 向南移动
           } else if(str[i-1]=='W'){
               x--; // 向西移动
           } else{
               y++; // 向北移动
           }
       }
       // 输出机器人在时间t后的位置
       cout<<x<<''<<y;
   }
   else{
       // 如果指令序列的长度不大于时间t,先执行完整个序列
       for(int i=1;i<=str.size();i++){
           if(str[i-1]=='E'){
               x++;
           } else if(str[i-1]=='S'){
               y--;
           } else if(str[i-1]=='W'){
               x--;
           } else{
               y++;
           }
       }
       // 计算循环执行的次数和剩余时间
       int rest=t%str.size(); // 剩余时间
       t/=str.size(); // 循环执行的次数
       int newx,newy; // 用于存储循环后的位置
       // 累加循环执行后的位置
       for(int i=1;i<=t;i++){
           newx+=x;
           newy+=y;
       }
       // 根据剩余时间更新位置
       for(int i=1;i<=rest;i++){
           if(str[i-1]=='E'){
               newx++;
           } else if(str[i-1]=='S'){
               newy--;
           } else if(str[i-1]=='W'){
               newx--;
           } else{
               newy++;
           }
       }
       // 输出最终位置
       cout<<newx<<''<<newy;
   }
   return 0;
}

5.生长思考

我们在先遇到 N ( E ),再遇到 S ( W )的情况下,其实无需进行任何操作。因此,我们可以使用类似洛谷 P1739 表达式括号匹配这题的方法解出此题。

生长思考不提供代码 \textcolor{#e9e9e9}{生长思考不提供代码} 生长思考不提供代码文章来源地址https://www.toymoban.com/news/detail-842066.html

到了这里,关于洛谷 U123017 机器人题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)R4,R5题解

    就是给你一堆操作修改上面的数组让他变成下面数组,输出最小修改次数和方案 一眼dp,跑一遍dp记录方案数即可; dp[i][j]表示从左往右修改,第一个数组的i位等于第二个数组的j位的最小修改方案. c++能过代码 输入样例 输出样例 思路 先lca搞出来任意两点之间的距离。然后按

    2024年02月12日
    浏览(60)
  • 2022 Robocom世界机器人开发者大赛 CAIP编程赛道 本科组-决赛 挨打记录+题解

    打完决赛本菜鸡可以退役辣!并不是很开心因为上学期的考试还没复习完,哭了TAT 由于PTA还没有上架题目,只能描述个大概,各位姥爷见谅 给定一串时间序列,表示在什么时刻按了开关。在按下之后的15秒后会变绿灯,持续30秒,如果在持续期间有再次被按下则延长15秒,只

    2024年02月16日
    浏览(43)
  • 机器人控制算法——移动机器人横向控制最优控制LQR算法

    1.Introduction LQR (外文名linear quadratic regulator)即线性二次型调节器,LQR可得到状态线性反馈的最优控制规律,易于构成闭环最优控制。LQR最优控制利用廉价成本可以使原系统达到较好的性能指标(事实也可以对不稳定的系统进行整定) ,而且方法简单便于实现 ,同时利用 Matlab 强

    2024年02月04日
    浏览(49)
  • 扫地机器人(二分算法+贪心算法)

    1.  if(robot[i]-len=sweep)这个代码的意思是——如果机器人向左移动len个长度后,比现在sweep的位置(现在已经覆盖的范围)还要靠左,就是覆盖连续不起来,呢么这个len就是有问题的,退出函数,再继续循环。 2.  显然当每个机器人清扫的范围相同时,所用时间最小,所以这时

    2024年01月20日
    浏览(45)
  • 基于C#的机器人仿真平台和机器人运动学算法实现

    一、平台搭建 1.利用wpf自带的库进行机器人各关节导入 相关代码段: 导入效果如图: 效果视频: 2.通过正运动学显示机器人当前位置信息 拖动机器人并且实时改变其位置信息: xaml代码部分: 算法部分:  3.功能实现(在X/Y/Z轴上设置一个移动距离,然后机器人自动移动该

    2024年02月16日
    浏览(55)
  • 机器人集群控制算法概述

    机器人集群控制算法是指一组算法,用于协调和控制多个机器人协同工作,以完成特定任务或达到特定目标。以下是一些常见的机器人集群控制算法: 集群协同行为算法: 领航者/跟随者(Leader/Follower): 一个机器人被指定为领导者,其他机器人跟随领导者的运动。这种方法

    2024年03月15日
    浏览(54)
  • 机器人控制算法——TEB算法—Obstacle Avoidance and Robot Footprint Model(避障与机器人足迹模型)

    1.1处罚条款 避障是作为整体轨迹优化的一部分来实现的。显然,优化涉及到找到指定成本函数(目标函数)的最小成本解(轨迹)。简单地说:如果一个计划的(未来)姿势违反了与障碍物的期望分离,那么成本函数的成本必须增加。理想情况下,在这些情况下,成本函数值

    2024年02月06日
    浏览(49)
  • 算法题——机器人的运动范围

    声明 该系列文章仅仅展示个人的解题思路和分析过程,并非一定是优质题解,重要的是通过分析和解决问题能让我们逐渐熟练和成长,从新手到大佬离不开一个磨练的过程,加油! 原题链接 机器人的运动范围 https://leetcode.cn/leetbook/read/illustration-of-algorithm/9h6vo2/ 算法分析 图

    2024年02月11日
    浏览(45)
  • 【多机器人】基于A_Star算法实现多机器人路径规划附Matlab代码

     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进, 代码获取、论文复现及科研仿真合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab完整代码及仿真定制内容点击👇 智能优化算法       神经网络预测       雷达通信    

    2024年02月04日
    浏览(53)
  • 遨博协作机器人高级编程 - 遨博机器人SDK用户自定义算法接口介绍与使用

    目录 一、简介 二、环境版本 三、开发环境部署 1.二次开发资料下载 2. AUBO PE编程仿真环境配置 四、linux C++ SDK示例 1. 编程环境 2. 加载C++ SDK工程 3. linux C++ SDK 文件构成 4.运行SDK示例 五、构建用户自定义算法SDK示例工程 1.Linux C++ SDK透传接口 2.  创建新项目 3.导入遨博机器人

    2024年02月14日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包