蓝桥杯 历届真题 机器人行走【第三届】【决赛】【高职组】

资源限制

时间限制:1.0s   内存限制:256.0MB


问题描述

  某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。
  例如,我们可以对小车输入如下的指令:
  15L10R5LRR10R20
  则,小车先直行15厘米,左转,再走10厘米,再右转,...
  不难看出,对于此指令串,小车又回到了出发地。
  你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。

输入、输出格式要求

  用户先输入一个整数n(n<100),表示接下来将有n条指令。
  接下来输入n条指令。每条指令只由L、R和数字组成(数字是0~100之间的整数)
  每条指令的长度不超过256个字符。
  程序则输出n行结果。
  每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后2位。
  例如:用户输入:
  5
  L100R50R10
  3LLL5RR4L12
  LL
  100R
  5L5L5L5
  则程序输出:
  102.96
  9.06
  0.00
  100.00
  0.00


 解题思路:

        题目要求输出移动前后的直线距离,我们可以把小车移动前和移动后的位置想象成平面直角坐标系上的两个点,移动前后的直线距离就是这两个点的距离,我们可以认为小车移动前的坐标为(0,0),小车移动后的坐标为(x,y)。

        既然是点到点的距离,那我们肯定要求移动后小车的坐标(x,y),我们可以用一个变量标识小车的方向

int k = 0;//最初的方向

然后根据方向确定小车移动时对应的(x,y)的加或减,进而求出小车的坐标(x,y)

我这里用了一个数组确定x、y是加还是减

int move[4] = {1, 1, -1, -1};//方向,0/1/2/3分别代表上右下左,接收方向时左减右加

具体咋淦看代码就完了 


 完整代码如下

#include<iostream>
#include<math.h>
//#include<bits/stdc++.h>

using namespace std;

int main()
{
    int move[4] = {1, 1, -1, -1};//方向,0/1/2/3分别代表上右下左,接收方向时左减右加
    int n;
    cin >> n;
    float end[n] = {0};//存储每一条指令执行后,移动前后的距离
    for (int i = 0; i < n;i++)
    {
        int x = 0, y = 0;//移动前的位置
        int k = 0;//最初的方向
        string order;//存储每一条指令
        cin >> order;
        int Max = order.size();
        for (int j = 0; j<Max;j++)
        {
            if(order[j]=='L'||order[j]=='R')//当前位置输入的是方向
            {
                
                if(order[j]=='R')//右转
                    k = (k + 1) % 4;
                else//左转
                    k = k == 0 ? 3 : k - 1;
                
            }
            else
            {
                int dis = 0;//移动距离
                int i;
                for (i = j; order[i] >= '0' && order[i] <= '9';i++)//这个循环用来求出每个直线移动的距离
                {
                    dis = dis * 10 + (order[i] - '0');
                }
                j = i-1;//上面for循环语句三有个j++,所以这里要减一,不然会跳过符号
                if(k%2)//当前方向在x轴上
                {
                    x += dis * move[k];
                }
                else//当前方向在y轴上
                {
                    y += dis * move[k];
                }
            }

        }
        end[i]= sqrt(pow(x, 2) + pow(y, 2));//保存距离
    }
    for (int i = 0; i < n;i++)
    {
        printf("%.2f\n", end[i]);
    }
    system("pause");
    return 0;
}

我表达的可能有点问题,凑活着看看就成 。

兄弟们一起卷,淦就完了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值