• 蓝桥杯---机器人行走




    某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有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


    【注意】

        请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
       

    用模拟来完成的,用三个参数来记录和决定到底要怎么走,分别是当前的方向、左转和右转、前进的步数

    挺简单的并且注释很全,直接贴码...

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <memory.h>
    using namespace std;
    int  horizontal=0,vertical=0;//分别记录竖直和水平离开原点的距离 
    char judge(char now,char lefORrig,int n){//三个变量分别代表着当前的方向,所进行的操作,前进的步数
    	switch(now){
    		case 'N':
    			if(lefORrig=='L') {  horizontal-=n;  return 'W';}
    			else  {  horizontal+=n;  return 'E';}
    		case 'S':
    			if(lefORrig=='L')  {  horizontal+=n;  return 'E';}
    			else  {  horizontal-=n;  return 'W';}
    		case 'W':
    			if(lefORrig=='L')  {  vertical-=n;  return 'S';}
    			else  {  vertical+=n;  return 'N';}
    		case 'E':
    			if(lefORrig=='L') {   vertical+=n;  return 'N';}
    			else  {  vertical-=n;  return 'S';}
    	}	
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        while(n--)
        {
            horizontal=0,vertical=0;
            string str;
            cin>>str;
            int len = str.length(), i=0,sum;
            char now='N'; //让机器人开始的方向默认为北方
            if(i<len&&str[i]<='9'&&str[i]>='0')  //用来处理开始的时候直接出现数字直着走的情况
            {
                sum = 0;
                while(i<len&&str[i]<='9'&&str[i]>='0')sum=(int)(sum*10+str[i++]-'0'); //获得分离出来的和
                vertical+=sum;
            }
            while(i<len)
            {
                char tmpch = str[i++];
                sum = 0;
                while(i<len&&str[i]<='9'&&str[i]>='0') //获得分离出来的和 如果是连着转向的话就跳过该步骤,直接记录下和为0;
                    sum=(int)(sum*10+str[i++]-'0');
                now=judge(now,tmpch,sum);
            }
            printf("%.2f
    ",sqrt(horizontal*horizontal+vertical*vertical));
        }
        return 0;
    }


    
    






  • 相关阅读:
    解决首次访问网上邻居密码错误,而造成的以后都无权访问的解决方案。
    MapX开发日记(二)
    对于一个网卡绑定多个IP的问题。
    .net VS 全角问题
    DotnetBar MapX中动态生成可以查询地图数据的弹出菜单问题
    sqlServer 字符型字段默认为空字符串
    MapX开发日记(一)
    ASP.NET Dbtype属性无效 与系统自带控件为英文
    原创 c# 封装的带CheckBox的DataGridViewColumnHeaderCell 源码部分 实现DataGridView列头带CheckBox控件实现全选功能,支持列头带标题
    关于去共享锁获取脏数据
  • 原文地址:https://www.cnblogs.com/zswbky/p/5431981.html
Copyright © 2020-2023  润新知