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